JAVA语言之Spring Boot 2.0干货系列:(一)Spring Boot1.5X升级到2.0指南
小标 2019-03-04 来源 : 阅读 733 评论 0

摘要:本文主要向大家介绍了JAVA语言之Spring Boot 2.0干货系列:(一)Spring Boot1.5X升级到2.0指南,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言之Spring Boot 2.0干货系列:(一)Spring Boot1.5X升级到2.0指南,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

JAVA语言之Spring Boot 2.0干货系列:(一)Spring Boot1.5X升级到2.0指南

前言
Spring Boot已经发布2.0有满久了,多了很多新特性,一些坑也慢慢被填上,最近有空,就把本博客中Spring Boot干货系列对应的源码从1.5X升级到Spring Boot 2.0,顺便整理下升级的时候遇到的一些坑,做个记录。后续的教程就以最新的2.03版本为主。

依赖 JDK 版本升级


2.x 至少需要 JDK 8 的支持,2.x 里面的许多方法应用了 JDK 8 的许多高级新特性,所以你要升级到 2.0 版本,先确认你的应用必须兼容 JDK 8。


另外,2.x 开始了对 JDK 9 的支持。


第三方类库升级


2.x 对第三方类库升级了所有能升级的稳定版本,一些值得关注的类库升级我给列出来了。


1) Spring Framework 5+


2) Tomcat 8.5+


3) Flyway 5+


4) Hibernate 5.2+


5) Thymeleaf 3+


启动类报错


问题:


启动类SpringBootServletInitializer标红报错,导入的类不对。


原因:


Spring Boot 部署到 Tomcat 中去启动时需要在启动类添加SpringBootServletInitializer,2.0 和 1.0 有区别。


解决方案:


package com.dudu;
import com.dudu.util.MyMapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;br/>@SpringBootApplication<br <="" a="">//启注解事务管理
@EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />
@MapperScan(basePackages = "com.dudu.dao", markerInterface = MyMapper.class)
public class Application extends SpringBootServletInitializer {br/>@Override<br <="" a="">protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}


配置文件报错


问题:


配置文件中项目名称配置报错:server.context-path: /spring


原因:


大量的Servlet专属的server.* properties被移到了server.servlet下:

由此可以看出一些端倪,那就是server不再是只有servlet了,还有其他的要加入。


解决方案:


server.context-path: /spring改成server.servlet.context-path: /spring既可


Web Starter 作为传递依赖


问题:


工程用的模板是thymeleaf,启动报错提示找不到spring-boot-starter-web


原因:


以前有几个 Spring Boot starter 是依赖于 Spring MVC 而传递的spring-boot-starter-web。在 Spring WebFlux 新的支持下,spring-boot-starter-mustache,spring-boot-starter-freemarker并spring-boot-starter-thymeleaf不再依赖它。开发者有责任选择和添加spring-boot-starter-web或spring-boot-starter-webflux。


解决方案:


导入spring-boot-starter-web既可



<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>



Thymeleaf 3.0 默认不包含布局模块


问题:


启动项目的时候发现首页空白,查看后台也没有任何的报错信息


原因:


Spring Boot 2.0 中spring-boot-starter-thymeleaf 包默认并不包含布局模块,需要使用的时候单独添加。


解决方案:
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>


拦截器过时


问题:


升级后,WebMvcConfigurerAdapter提示过时


原因:


升级后的springBoot,使用了java8的特性 default 方法,所以直接实现 WebMvcConfigurer 这个接口即可。


解决方案:


旧:



public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter



新:



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就是我放静态文件的目录

全局异常特殊处理


问题:


上一篇提到过的有些错误你可能想特殊对待处理的,现在对应代码标红,找不到对应的类


原因:


新版本后该方法去掉了,需要换成新的方法处理


解决方案:


旧代码:



@Configuration
public class ContainerConfig {br/>@Bean<br <="" a="">public EmbeddedServletContainerCustomizer containerCustomizer(){
return new EmbeddedServletContainerCustomizer(){br/>@Override<br <="" a="">public void customize(ConfigurableEmbeddedServletContainer container) {
container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500"));
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/404"));
}
};
}
}


新代码:



@Configuration
public class ContainerConfig implements ErrorPageRegistrar {br/>@Override<br <="" a="">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.x了,各位小伙伴也可以尝试看看,虽然还有一些坑,但是估计用的时候别人都填上了,后续就一起来体验Spring Boot 2.x的新特性吧。
针对学习这件事,我想想讲讲我的看法,
第一:绝对的三个字:靠自己,任何人都帮不了你。
第二:切勿眼高手低,好说懒做,动动嘴比谁都快,动手的时候就怂了
,这不是一个技术人应该有的态度。
第三:别人给你的只会是思路与方法,实际内容还需要自己去填充,
没有坐等这回事,绝逼没有。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程