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

☆.JDK版本的升级

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

☆.三方类库升级

    1. Spring Framework 5+
    1. Tomcat 8.5+
    1. Flyway 5+
    1. Hibernate 5.2+
    1. 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 包默认并不包含布局模块,需要使用的时候单独添加。


   nz.net.ultraq.thymeleaf
   thymeleaf-layout-dialect

☆.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)