【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.mzph.cn/news/779307.shtml

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

相关文章

北京WordPress建站公司

北京wordpress建站,就找北京wordpress建站公司 http://wordpress.zhanyes.com/beijing

【VSCode】解决远程配置jupyter notebook始终无法搜到kernel

问题 jupyter kernel一直无法选择,总是出现如下提示。反复点install/enable没有用处。 解决 首先确认Python Interpreter是否能正常选择。可能出现终端可以搜到conda env但vscode command palette中不显示的问题。如果不显示,尝试手动enable Python ex…

20232831 2023-2024-2 《网络攻防实践》第4次作业

目录 20232831 2023-2024-2 《网络攻防实践》第4次作业1.实验内容2.实验过程(1)ARP缓存欺骗攻击(2)ICMP重定向攻击(3)SYN Flood攻击(4)TCP RST攻击(5)TCP会话…

R语言使用dietaryindex包计算NHANES数据多种营养指数(2)

健康饮食指数 (HEI) 是评估一组食物是否符合美国人膳食指南 (DGA) 的指标。Dietindex包提供用户友好的简化方法,将饮食摄入数据标准化为基于指数的饮食模式,从而能够评估流行病学和临床研究中对这些模式的遵守情况,从而促进精准营养。 该软件…

C/C++中重载函数取地址的方法

目录 1.现象 2.指定参数取函数地址 3.利用Qt的类QOverload 1.现象 函数重载在C/C编码中是非常常见的,但是我们在std::bind或std::function绑定函数地址的时候,直接取地址,程序编译就会报错,示例如下: class CFunc1…

【C++】map set

文章目录 1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set 的介绍3.1.2 set 的使用 3.2 map3.2.1 map 的介绍3.2.2 map 的使用 3.3 multiset3.3.1 multuset 的介绍3.3.2 multiset 的使用 3.4 multimap3.4.1 multimap 的介绍3.4.2 multimap 的使用 1. 关联式容器…

Docker安装xxl-job并整合到SpringBoot项目

1. 创建数据库 执行如下SQL语句创建相关表 CREATE database if NOT EXISTS xxl_job default character set utf8mb4 collate utf8mb4_general_ci; use xxl_job;SET NAMES utf8mb4; CREATE TABLE xxl_job_info (id int(11) NOT NULL AUTO_INCREMENT,job_group int(11) NOT NUL…

PyCharm代码一键格式化

前言 每次写完代码,就看见很多警告,乍一看还以为我又写了什么bug,原来是提示,啊放心了。可是我可见不得这些东西,因为代码里都是红红的下划线,好像在圈圈点点。。。 代码格式化 于是利用PyCharm里的快捷…

【Go】六、函数

文章目录 1、函数的定义2、内存分析3、注意点4、函数数据类型5、自定义数据类型(起别名)6、支持对返回值命名 1、函数的定义 语法: func 函数名(形参列表)(返回值类型列表){执行语句..return 返回值列…

mac系统使用经验

mac安装brew brew是macos下的一个包管理工具,类似与centos的yum,ubuntu的apt-get等。 自动脚本(全部国内地址)(在Mac os终端中复制粘贴回车下面这句话) /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/H…

PHP实现单列内容快速查重与去重

应用场景:excel一列内容比如身份证号&#xff0c;可能有重复的&#xff0c; 则用此工具快速查询那些重复及显示去重后内容。 使用&#xff1a;粘贴一列数据&#xff0c;然后提交发送。 <?php $tm "单列查重去重(粘贴Excel中1列内容查重)!";function tipx($str…

无人驾驶矿卡整体解决方案(5g物联网通信方案)

​无人驾驶矿卡是智能矿山的重要组成部分,通过远程操控替代人工驾驶,可以显著提高采矿效率和作业安全性。但要实现无人驾驶矿卡,需要依赖于可靠高效的通信网络,来传输现场视频、控制指令和运行数据。以下是某大型煤矿在部署无人驾驶矿卡时,所采用的星创易联物联网整体解决方案。…

基于springboot实现校园周边美食探索及分享平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现园周边美食探索及分享平台系统演示 摘要 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起&#xff0c;互联网日益成为提供信息的最佳俱渠道和逐步走向传统的流通领域&#xff0c;传统的…

YOLOV8逐步分解(2)_DetectionTrainer类初始化过程

接上篇文章yolov8逐步分解(1)--默认参数&超参配置文件加载继续讲解。 1. 默认配置文件加载完成后&#xff0c;创建对象trainer时&#xff0c;需要从默认配置中获取类DetectionTrainer初始化所需的参数args&#xff0c;如下所示 def train(cfgDEFAULT_CFG, use_pythonFalse…

python的神奇bug2

今天测试出一个很诡异的bug&#xff0c; 这个错误还真的很难发现 测试1 a [1,10,100] for i in a:print(i)if(i10):a[20,30,-1]一般来说我们在进行迭代时&#xff0c;a这个值时不能改动的&#xff0c;但是现在的问题时如果我不小心给改动了呢&#xff0c;结果如下 也就是说…

基于JSPM的美食推荐管理系统

背景 互联网的迅猛扩张彻底转变了全球各类组织的运营模式。自20世纪90年代起&#xff0c;中国各级政府和企事业单位便开始探索运用网络系统来处理管理事务。然而&#xff0c;早期的网络覆盖不广、用户接受度不高、相关网络法规不健全以及技术发展不成熟等因素&#xff0c;都曾…

达梦数据库新手上路排坑

数据库安装 这个没啥说的&#xff0c;按照官网教程操作&#xff0c;我使用的是docker进行安装 下载文件docker文件 官方下载地址- load -i dm8****.tar (注意修改为当前下载的文件)达梦官方文档注意修改为当前版本 docker run -d -p 5236:5236 --name dm8 --privilegedtrue -…

HarmonyOS 应用开发之PageAbility组件

PageAbility组件概述 PageAbility是包含UI、提供展示UI能力的应用组件&#xff0c;主要用于与用户交互。 开发者通过DevEco Studio开发平台创建PageAbility时&#xff0c;DevEco Studio会自动创建相关模板代码。PageAbility相关能力通过单独的featureAbility实现&#xff0c;…

STL —— vector(1)

博主首页&#xff1a; 有趣的中国人 专栏首页&#xff1a; C专栏 本篇文章主要讲解vector使用的相关内容 1. vector简介 vector 是 C 标准库中的一个容器类模板&#xff0c;它提供了动态数组的功能&#xff0c;可以方便地管理和操作元素的集合。下面是关于 vector 的一些基本信…

基于单片机智能家居控制系统设计

**单片机设计介绍&#xff0c;基于单片机智能家居控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能家居控制系统设计旨在实现家居设备的自动化控制和智能化管理&#xff0c;提高家庭生活的便利性和舒…