欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-30 20:01:12
...

☆.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 包默认并不包含布局模块,需要使用的时候单独添加。

<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"));

相关标签: SpringBoot2.0迁移