---
title: Spring boot升级到2.3.1笔记
date: 2020-07-06 16:35:39
description: Spring boot从1.5.8升级到2.3.1
categories: [技术总结]
tags: [Spring boot]
---
## 前言
> 老版本的Spring boot已经继续用了2年了,最近发现官网的推荐版本已经没有了1.5系列的了,下决心要升级大版本,把之前写的升级方案找出来参考了一下,这次应该还会碰到一些其他问题,特此记录以备不时之需
- Spring boot版本:`1.5.8.RELEASE` -> `2.3.1.RELEASE`
- Spring Data JPA版本: `1.11.8.RELEASE` -> `2.3.1.RELEASE`
本来想按官网的更稳妥的方案一步一步升级,但是由于我们使用的Spring boot功能比较少,CTO建议直接升级到最新版本
先按两年前的方案修改各种配置:[Spring boot升级到2.1](/blog/2018/11/26/spring-boot-update-version)
### 添加升级工具
升级文档中发现有升级工具,添加到pom中
```xml
org.springframework.boot
spring-boot-properties-migrator
runtime
```
### 本地h2数据库保留字问题
查询了一下,h2数据库版本从`1.4.196`到`1.4.200`,原先数据库表中有一些名称为`row`的字段,这些字段都变成保留字了,初始化的sql执行报错
原先思路是修改字段名称,这样改动太大了,CTO建议h2单独切换回老版本,测试后没有问题了
```xml
com.h2database
h2
1.4.196
```
### swagger2版本冲突问题
启动仍然报错:
``` log
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method linkDiscoverers in org.springframework.hateoas.config.HateoasConfiguration required a single bean, but 3 were found:
- relProviderPluginRegistry: defined by method 'relProviderPluginRegistry' in class path resource [org/springframework/hateoas/config/HateoasConfiguration.class]
- linkDiscovererRegistry: defined in null
- entityLinksPluginRegistry: defined by method 'entityLinksPluginRegistry' in class path resource [org/springframework/hateoas/config/WebMvcEntityLinksConfiguration.class]
Action:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
Disconnected from the target VM, address: '127.0.0.1:61337', transport: 'socket'
Process finished with exit code 1
```
网上搜索了一下这个报错,说是和swagger2版本有关,修改pom中的版本号(`2.2.2`->`2.9.2`)之后问题就解决了
### 时间格式问题
测试类报了时间比对错误,去官网升级指南中找到了相关说明:
In 2.0, we’ve flipped a Jackson configuration default to write JSR-310 dates as ISO-8601 strings. If you wish to return to the previous behavior, you can add `spring.jackson.serialization.write-dates-as-timestamps=true` to your configuration.
在测试类中添加时间格式设置
```properties
spring.jackson.serialization.write-dates-as-timestamps = true
```
到此为止,新版本的兼容已经OK了,项目能正常运行了,测试类也全部可以通过了。
后面仍需要完善一些警告,过时方法等,经过小范围的试用后就可以确定升级方案了。
### 参考资料
Spring boot v1.5 → v2.0 升级指南:[Spring Boot 2.0 Migration Guide](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide)
Spring boot 最新文档:[Spring Boot Reference Documentation](https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/)