Spring Boot 1.x升级到Spring Boot 2.0迁移指南
☆.JDK版本的升级
- Spring Boot 1.x jdk 7 起飞
- Spring Boot 2.x jdk8 起飞
☆.三方类库升级
-
- Spring Framework 5+
-
- Tomcat 8.5+
-
- Flyway 5+
-
- Hibernate 5.2+
-
- Thymeleaf 3+
☆.spring boot 项目打包为war需要实现的SpringBootServletInitializer类路径变化
// 1.0
//import org.springframework.boot.web.support.SpringBootServletInitializer;
// 2.0
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class UserManageApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(UserManageApplication.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(UserManageApplication.class, args);
}
}
☆.thymeleaf 布局依赖需独立添加
Spring Boot 2.0 中spring-boot-starter-thymeleaf 包默认并不包含布局模块,需要使用的时候单独添加。
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>
☆.Spring Boot 2.0 WebMvcConfigurerAdapter提示过时
升级后的springBoot,使用了java8的特性 default 方法,所以直接实现 WebMvcConfigurer 这个接口即可。
Spring Boot 1.x
·public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter·
Spring Boot 2.0
·public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer·
☆.静态资源被拦截
1.5版本时候META-INF/resources / resources / static / public 都是spring boot 认为静态资源应该放置的位置,会自动去寻找静态资源,而在spring boot 2.0则对静态资源也进行了拦截,当拦截器拦截到请求之后,但controller里并没有对应的请求时,该请求会被当成是对静态资源的请求。此时的handler就是 ResourceHttpRequestHandler,就会抛出上述错误。
解决方案:
/**
* 拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatternss("/toLogin","/login","/assets/**","/js/**");
}
assets就是放静态文件的目录
☆.全局异常特殊处理
Spring Boot 1.x
@Configuration
public class ContainerConfig {
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer(){
return new EmbeddedServletContainerCustomizer(){
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500"));
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/404"));
}
};
}
}
Spring Boot 2.0
@Configuration
public class ContainerConfig implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
ErrorPage[] errorPages = new ErrorPage[2];
errorPages[0] = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500");
errorPages[1] = new ErrorPage(HttpStatus.NOT_FOUND, "/error/404");
registry.addErrorPages(errorPages);
}
}
☆.Spring Boot 2.0默认数据源由tomcat改变为Hikari
如果之前的Spring Boot 1.x项目使用了spring.datasource.tomcat.xxx配置数据源,需要修改为hikari否则默认数据源将会无法被初始化
spring.datasource.hikari.username=
spring.datasource.hikari.password=
spring.datasource.hikari.driver-class-name=
spring.datasource.hikari.jdbc-url=
☆.Spring Boot 2.0 日期类型数据默认返回改变
Spring Boot 1.x日期类型数据在不指定格式的情况下,默认返回的是时间戳。
Spring Boot 2.0日期类型数据默认返回的是字符串的一个日期格式
Spring Boot 2.0 中在application.properties文件中配置以下内容来默认返回时间戳
spring.jackson.serialization.write-dates-as-timestamps = true
☆.Spring Data Jpa 相关改动
Spring Boot 2.0 去掉了findOne()方法
以前的findOne()方法其实就是根据传入的 Id 来查找对象,所以在 Spring Boot 2.0 的 Repository 中我们可以使用findById(long id)来替换使用。
delete()方法和findOne()类似也被去掉了,可以使用deleteById(Long id)来替换,还有一个不同点是deleteById(Long id)默认实现返回值为void
分页组件PageRequest变化
在 Spring Boot 2.0 中 ,方法new PageRequest(page, size, sort) 已经过期不再推荐使用,推荐使用以下方式来构建分页信息:
Pageable pageable =PageRequest.of(page, size, Sort.by(Sort.Direction.ASC,"id"));
推荐阅读
-
Spring Boot 配置元数据指南
-
Spring Boot 2.0 设置网站默认首页的实现代码
-
spring boot 2.0 整合 elasticsearch NoNodeAvailableException
-
spring boot 2.0 源码分析(四)
-
Spring Boot 2.0 升级指南
-
spring boot 2.0 Feign的客户端
-
Spring Boot 项目瘦身指南,瘦到不可思议!
-
Spring Boot OAuth 2.0 客户端
-
基于Spring Boot 2.0.2.RELEASE 的 Spring Cloud 速成指南 | 二. Spring Cloud 服务注册中心(Eureka Server)
-
spring boot2.0 自定义配置取值问题解决