【scala】使用gradle和scala构建springboot程序

零、版本说明:

springboot: 2.7.18
使用log4j2,不使用springboot自带的logback
scala版本:2.11
jackson版本:2.16.0

一、依赖:

buildscript {dependencies {// using spring-boot-maven-plugin as package toolclasspath("org.springframework.boot:spring-boot-maven-plugin:2.7.18")}
}
plugins {id 'idea'id 'scala'id 'org.springframework.boot' version '2.7.18'id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
// 指定java版本
sourceCompatibility = 1.8
targetCompatibility = 1.8
// 尽量使用2.16.0版本的jackson对scala支持更好。
ext {jackson_version = '2.16.0'
}dependencies {implementation("org.springframework.boot:spring-boot-starter-web") {exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'}implementation("org.springframework.boot:spring-boot-starter-log4j2")testImplementation("org.springframework.boot:spring-boot-starter-test") {exclude group: 'org.junit.jupiter'}testImplementation 'io.projectreactor:reactor-test:3.4.29'implementation("com.fasterxml.jackson.core:jackson-core:${jackson_version}")implementation("com.fasterxml.jackson.core:jackson-annotations:${jackson_version}")implementation("com.fasterxml.jackson.core:jackson-databind:${jackson_version}")implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:${jackson_version}")implementation("com.fasterxml.jackson.module:jackson-module-scala_2.11:${jackson_version}")testImplementation "com.fasterxml.jackson.core:jackson-core:${jackson_version}"testImplementation("com.fasterxml.jackson.core:jackson-annotations:${jackson_version}")testImplementation("com.fasterxml.jackson.core:jackson-databind:${jackson_version}")testImplementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:${jackson_version}")testImplementation("com.fasterxml.jackson.module:jackson-module-scala_2.11:${jackson_version}")
}
configurations {all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}

主启动类

此处也可以继承scala的App 但需要注意要重新App中的main方法。

import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.{ SpringBootApplication}@SpringBootApplication
class AppServe
object AppServer {private val log = org.slf4j.LoggerFactory.getLogger(classOf[AppServer])def main(args: Array[String]): Unit = {log.info(s"${getClass.getName} get args: ${args.toList.toString()}")SpringApplication.run(classOf[AppServer], args: _*)}
}

scala常用获取jackson objectMapper参考:

     // scaladef getMapper: ObjectMapper = {var mapper: ObjectMapper = JsonMapper.builder().addModule(DefaultScalaModule).build() :: ClassTagExtensionsmapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)mapper

springboot序列化使用的是jackson,而自带的jackson版本较低,且不支持scala。

import com.fasterxml.jackson.databind.Module
import com.fasterxml.jackson.module.scala.{ClassTagExtensions, DefaultScalaModule}
import org.springframework.context.annotation.{Bean, Configuration}
import lombok.extern.slf4j.Slf4j/*** https://blog.csdn.net/beibaozhou1656/article/details/100966023*/
@Configuration
class JacksonConfiguration {@Beandef defaultScalaModule(): Module = {// 暂没有办法加:ClassTagExtensionsDefaultScalaModule}
}

controller类

注意:@Resource()@Autowire)使用方法。

import org.springframework.web.bind.annotation.{PostMapping, PutMapping, RequestBody, RequestMapping, RestController}
import lombok.extern.slf4j.Slf4j@RestController
@RequestMapping(Array("/v1"))
class BatchController @Resource()(batchService: BatchSaveService) {@PostMapping(Array("/batch/save"))def batchSave(@RequestBody tbls: java.util.List[Element]): Unit = {batchService.batch(tbls.asScala)}
}

配置文件值获取

application.properties,application.yml,application.yaml文件
在这里插入图片描述

import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Component
import javax.annotation.PostConstruct@Component
class EnvConfiguration() {
// 注意:要去除value=s"${}"的`s`。@Value(value = "${udf.kafka.consumer.krb5-conf}") var krb5Conf: String = _@Value(value = "${udf.kafka.topic}") var topic: String = _@PostConstructdef init(): Unit = {// 使用在post construct之后可以使用krb5Conf变量System.setProperty( ... )}def getTopic():String={topic
}
}
import lombok.extern.slf4j.Slf4j
import org.apache.kafka.clients.consumer.ConsumerRecord
import org.springframework.kafka.annotation.KafkaListener
import org.springframework.stereotype.{Component}
import javax.annotation.Resource/*** kerberos整合kafka、springboot* https://blog.csdn.net/weixin_40496191/article/details/124056953* SpringBoot集成Kafka详解* https://blog.csdn.net/qq_20865839/article/details/13394898*/
@Component
class KafkaTableService @Resource()(service: CommonServiceImpl)  extends Logging {val mapper = JsonUtils.getMapper
// 可以使用#{}在注解中使用被@Component的的方法。@KafkaListener(topics = Array("#{EnvConfiguration.getTopic()}"))def onMessage(record: ConsumerRecord[String, String]) = {// do nothing}
}

注意:

1、springboot打包必须使用spring-boot-maven-plugin,不能使用gradle的shadowJarcom.github.johnrengelman.shadow
正确的jar应如下目录结构:
在这里插入图片描述

2、idea中debug
在这里插入图片描述将所有application.yml等配置文件放在test/resources目录下,可以避免jar中含有配置文件,但测试时候会发现找不到配置文件。如果此时在点击object前的run或者debug,不是以test方式run的不会触发gradle的test,不会有如下test目录和不会触发gradle resource copy任务,当然即使触发了也没用,因为此处我们直接run main方法,不是test任务,classpath不会包含build/resources/test目录,只会包含build/resources/main
在这里插入图片描述
解决办法:
在idea启动参数添加如下,注意下resources/以结尾,/告知spring此路径是个目录,不是文件。
另使用--spring.config.additional-location=也是可以的。

--spring.config.location=D:/projects/my-project/my-moudel/src/test/resources/

从而实现打包没有配置文件,但run springboot可以加载到test/resources配置文件。

3、无需设置main-class,springboot的插件设置。
4、生产环境启动 nohub java -jar xxx.jar 2>&1 &
5、jackson版本最好高于2.16.0
jackson-module-scala 官方文档:
在这里插入图片描述
6、java语言动态参数如下,入参使用可以直接使用sum(1),即一个参数也可以使用。
在这里插入图片描述
但scala是不行的。需要明确指定类型是Array如下:
在这里插入图片描述
7、@Slf4j注解无法使用,此注解应该被idea lombok插件并在编译添加如下添加代码:
在这里插入图片描述
解决很简单,手动添加如下代码即可:

import org.slf4j.Logger
// class 适用
val LOG: Logger = org.slf4j.LoggerFactory.getLogger(this.getClass)
// object 适用
val LOG: Logger = org.slf4j.LoggerFactory.getLogger(classOf[类名称])

8、

参考文章:
Spring Boot 实践折腾记
Scala篇:整合springboot

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/577720.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

halcon例程学习——ball.hdev

dev_update_window (off) dev_close_window () dev_open_window (0, 0, 728, 512, black, WindowID) read_image (Bond, die/die_03) dev_display (Bond) set_display_font (WindowID, 14, mono, true, false) *自带的 提示继续 disp_continue_message (WindowID, black, true)…

【深耕 Python】Data Science with Python 数据科学(2)jupyter-lab和numpy数组

关于数据科学环境的建立,可以参考我的博客:【深耕 Python】Data Science with Python 数据科学(1)环境搭建 Jupyter代码片段1:简单数组的定义和排序 import numpy as np np.array([1, 2, 3]) a np.array([9, 6, 2, …

剑指Offer题目笔记22(快速排序)

快速排序定义: ​ 快速排序的基本思想是分治法,排序过程如下:在输入数组中随机选取一个元素作为中间值(pivot),然后对数组进行分区(partition),使所有比中间值小的数据移…

elasticsearch 8.12+kibana 8.12

准备工作:1.下载相关的安装包放到/usr/local/ES下面 elasticsearch下载地址:Download Elasticsearch | Elastic elasticsearch-head-master下载地址:https://github.com/mobz/elasticsearch-head/archive/master.zip node下载地址:Index of /dist/ kibana地址:Downl…

C++中的STL简介与string类

目录 STL简介 STL的版本 STL的六大组件 string类 标准库中的string类 string类的常用接口 string类对象对容量的操作 size()函数与length()函数 capacity()函数 capacity的扩容方式 reserve()函数 resize()函数 string类对象的操作 push_back()函数 append()函数 operator()函数…

【JavaScript算法】DOM树层级显示

题目描述: 上述表达式的输出结果为 [DIV] [P, SPAN, P, SPAN] [SPAN, SPAN]直接上代码 let tree document.querySelector(".a"); function traverseElRoot(elRoot) {const result [];function traverse(element, level) {if (!result[level]) {resul…

智能未来:一站式AI技术探索平台(一键收藏)

KKAI,(kk.zlrxjh.top) 一个融合了星火大模型和文心大模型技术的先进知识增强型大语言模型,致力于自然语言处理(NLP)技术的深入研究与开发。此模型展现了卓越的语义理解与内容生成技能,轻松应对…

[Python GUI PyQt] PyQt5快速入门

PyQt5快速入门 PyQt5的快速入门0. 写在前面1. 思维导图2. 第一个PyQt5的应用程序3. PyQt5的常用基本控件和布局3.1 PyQt5的常用基本控件3.1.1 按钮控件 QPushButton3.1.2 文本标签控件 QLabel3.1.3 单行输入框控件 QLineEdit3.1.4 A Quick Widgets Demo 3.2 PyQt5的常用基本控件…

静态住宅IP优缺点,究竟要怎么选?

在进行海外 IP 代理时,了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和,并提供选择建议,帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

2024最新嵌入式学习路线,太顶了

2024最新嵌入式学习路线,太顶了!!! 嵌入式系统是一种将软件和硬件紧密结合的技术。在我们投身嵌入式行业时,首先需要认识到,无论我们是专注于软件开发还是硬件开发,最终的目标都是为了更好的工作…

JSON 文档存储详解

JSON(JavaScript Object Notation、JavaScript 对象表示法)是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。JSON 易于阅读和编写,同时也方便机器解析和生成,并且能够有效地提升网络传…

关于Oracle VM VirtualBox无法查询IP地址的原因

1.如下,输入ifconfig却没有显示我框住的显示IP。 2.原因有可能: (1)主机没连上网络。 (2)虚拟机网络设置不正确。