将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.*。

结束

广告
将在 10 秒后关闭
bannerAds