logo-cover-Spring Boot 1.x升级到Spring Boot 2.0迁移指南

☆.JDK版本的升级

  • Spring Boot 1.x jdk 7 起飞
  • Spring Boot 2.x jdk8 起飞


☆.三方类库升级

  • 1) Spring Framework 5+
  • 2) Tomcat 8.5+
  • 3) Flyway 5+
  • 4) Hibernate 5.2+
  • 5) 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"));