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;@SpringBootApplication
br/>@SpringBootApplication
@EnableTransactionManagement // 啟註解事務管理,等同於xml配置方式的 <tx:annotation-driven />
@MapperScan(basePackages = "com.dudu.dao", markerInterface = MyMapper.class)
public class Application extends SpringBootServletInitializer {@Override
br/>@Override
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 {@Bean
br/>@Bean
return new EmbeddedServletContainerCustomizer(){@Override
br/>@Override
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 {@Override
br/>@Override
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的新特性吧。
針對學習這件事,我想想講講我的看法,
第一:絕對的三個字:靠自己,任何人都幫不了你。
第二:切勿眼高手低,好說懶做,動動嘴比誰都快,動手的時候就慫了
,這不是一個技術人應該有的態度。
第三:別人給你的只會是思路與方法,實際內容還需要自己去填充,
沒有坐等這回事,絕逼沒有。
同意的老鐵請點贊、轉發此文章支持!也可以加群 558787436 交流學習哦
Spring Boot 2.0幹貨系列:(一)Spring Boot1.5X升級到2.0指南