1. 程式人生 > >Spring Boot 2.0幹貨系列:(一)Spring Boot1.5X升級到2.0指南

Spring Boot 2.0幹貨系列:(一)Spring Boot1.5X升級到2.0指南

大量 gist 博客 指南 gem follow ref contex str

前言
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指南