将Spring Boot版本从1.5.10升级到2.0.0的笔记
首先
由于正在制作的WEB应用程序使用的是SpringBoot 1.5.10版本,而新版本2.0.0已经发布,所以决定将其更新为新版本。以下是在这个过程中所做的事情和注意事项的备忘录。请注意,以下只记录了在制作中的WEB应用程序中所需的内容。
-
- Spring Web MVC
-
- Spring Security
-
- Thymeleaf
- Gradle
追加信息(4/18):由于在2.0.0版本中使用的Spring Framework 5.0.4发现了一个安全漏洞,因此升级到对应的5.0.5版本,即2.0.1版本。更多详细信息请参考(https://www.jpcert.or.jp/at/2018/at180014.html)。
大致的变更
Spring4 → Spring5
春季4 → 春季5
以下是Spring5的主要更改内容的概述,以下文章对此提供了非常有参考价值的信息:参考)Spring Framework 5.0 主な変更点の概要
Java8以后是必须的。
由于Java最初就是8,所以没有受到影响。
Thymeleaf2转为Thymeleaf3。
也许是我制作的应用程序中最有影响力的部分。
关于具体做了什么
暫時先將gradle的SpringBoot版本設置為2.0.0,不做任何修改就進行了無篩選的建置測試。
立刻就遇到了錯誤,所以要仔細查看步驟,按順序解決這些問題。
所有好的孩子们,请细心阅读Spring Boot 2.0的迁移指南,将房间亮堂起来,离开一下试试看。
1. Gradlew的升级版
我因为一直使用的是2.x版本的gradlew,所以现在需要使用4.x以上版本的。(我是罪魁祸首)
将wrapper任务的版本更新到最新。
建立.gradle
task wrapper(type: Wrapper) {
gradleVersion = '4.6' //バージョンを4.x以上に設定
}
在build.gradle中添加wrapper任务,并执行命令gradle wrapper,将其转换为高于4.x版本的gradlew。
这样,您就可以使用gradlew来构建Spring Boot 2.0.0应用程序。
参考)Spring Boot 2.0 发布说明中的 gradle-plugin 部分。
2. spring-boot-gradle-plugin的规格变更。
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management' // <-- add this to your build.gradle
随着版本升级,依赖关系管理插件似乎不再自动应用。
因此需要显式加载它,按照指示添加一行即可。
参考)Spring-Boot-2.0-Migration-Guide#spring-boot-gradle-plugin
参考)《Spring Boot 2.0 迁移指南》 #spring-boot-gradle-plugin
3. application.yml(属性文件)的规范更改。
似乎有一个名为spring-boot-properties-migrator的检查工具。
暂时在build.gradle的依赖关系中添加。
执行gradle build并启动SpringBootApplication。
然后,在控制台上会出现一条不熟悉的消息。
它将告诉你哪些属性的名称已更改,或者已经消失了。
在开始之前,请参考《Spring Boot 2.0 迁移指南》。
4. 用于验证的休眠验证器
Hibernate Validator的NotEmpty注解已被弃用。
虽然对我没有影响,但除了NotEmpty之外,NotBlank、Email、ModCheck等注解也被标记为弃用。
请使用标准的非空约束条件。
由于某种原因,我进行了相应的修正。
参考)Hibernate Validator – 弃用的 API
5. SpringMvc的JavaConfig
WebMvcConfigurerAdapter被弃用了。
参考)Spring-javadoc 的 WebMvcConfigurerAdapter.java 文件
从5.0版本开始,WebMvcConfigurer具有默认方法(基于Java 8的基线),可以直接实用而无需适配器。
由于WebMvcConfigurer接口现在拥有默认方法,所以不再需要适配器的存在。
WebMvcConfig.java在修改之前。
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter
{
// 略
}
更改后的WebMvcConfig.java
@Configuration
public class WebMvcConfig implements WebMvcConfigurer
{
// 略
}
6. 春季安全
参考链接:https://docs.spring.io/spring-security/site/docs/5.0.3.RELEASE/reference/htmlsingle/
参考链接:https://spring.io/blog/2017/09/15/security-changes-in-spring-boot-2-0-m4
待办事项:可能需要整理内容。
7. Thymeleaf的各种功能
在中国,原生的中文方式来表达”JavaConfig”的一种选项是: “Java配置”
请注意,虽然我们没有进行制作,所以对我们没有影响,但制作中的人可能会有变动。
请参考下面的迁移指南第2项”配置更改”,详细记录了相关信息。
参考:Thymeleaf 3 十分钟迁移指南
方言
这里彻底改变了,旧的东西都出现了错误。因为我正在制作一个类似于将换行代码转换为
标签的方言,所以我参考下面重新制作了它。
参考)用5分钟扩展Thymeleaf,向他人打招呼!
参考)再次打招呼!用另外5分钟进一步扩展Thymeleaf。
模板模式。
在Thymeleaf2的时候,由于解析器是基于XML的且检查非常严格,所以在设置TemplateMode.LEGACYHTML5后,我们使用了nekoHTML作为HTML解析器。但是在Thymeleaf3中,推荐使用TemplateMode.HTML,因此我们进行了更改(TemplateMode.LEGACYHTML5已被弃用)。
再见。
第二个不同之处在于模板模式具有TemplateMode.HTML的值。模板模式不再是字符串,并且可能的取值与Thymeleaf 2有一点不同。我们很快会讨论它。
参考)Thymeleaf 3 十分钟迁移指南
删除th:inline语法
并不会出错,但是迁移指南中确实有以下记载。
由于本次没有使用th:inline,所以不需要进行修正,但还是要小心不要不小心使用它。
我们唯一推荐对您的模板做出的更改是移除可能存在的th:inline=”text”属性,因为为了在HTML或XML模板中嵌入表达式,它们不再需要。这只是一个建议,模板仍然可以工作。但如果您移除这些属性,您将从一些额外的处理性能中受益。
建议进行修正。
Thymeleaf2 的意思是… (The meaning of Thymeleaf2 is…)
<tr th:inline="text" th:each="user : ${users}">
<td>[[$(user.id)]]</td>
<td>[[$(user.name)]]</td>
</tr>
(参考)Thymeleaf2 – 12.内联处理
3个Thymeleaf
<tr th:each="user : ${users}">
<td>[[$(user.id)]]</td>
<td>[[$(user.name)]]</td>
</tr>
参考: Thymeleaf3 – 12. 内联
※ 由于日文文档似乎仍然使用了2.x版本的说明,因此提供了英文文档的链接。
8. 连接池(补充)
默认的连接池已从Tomcat JDBC连接池更改为HikariCP。
由于实现的差异,受到影响的源代码在迁移时并未被考虑,因此被遗漏了,但我将进行补充说明。
迁移指南中写道,以前需要添加依赖关系才能使用HikariCP的人现在不再需要这样做了。
参考《Spring-Boot-2.0-Migration-Guide》 – 与SQL数据库的工作
在SpringBoot的文档中,也写道了这样一句话。
使用连接池数据源,生产数据库连接也可以自动配置。Spring Boot使用以下算法选择特定的实现:
1.我们优先选择HikariCP的性能和并发性。如果HikariCP可用,我们总是选择它。
2.否则,如果Tomcat连接池数据源可用,我们使用它。
3.如果既没有HikariCP也没有Tomcat连接池数据源可用,并且Commons DBCP2可用,我们使用它。
参考)Spring-Boot文档-使用Spring Boot连接生产数据库
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.test-on-borrow=true
如果定义了带有这种前缀的属性,是否会有影响呢?
听说HikariCP的配置是spring.datasource.hikari.*。
结束