Spring Boot 1.x升级到Spring Boot 2.0迁移指南
教程分享
>
Java教程
>
Spring
(8759)
2024-08-07 11:05:25
☆.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"));
https://www.leftso.com/article/484.html