最近想體驗下最新版本的SpringBoot,逛了下官網,發現SpringBoot目前最新版本已經是2.6.4
了,版本更新確實夠快的。之前的專案升級了2.6.4
版本後發現有好多坑,不僅有迴圈依賴的問題,連Swagger都沒法用了!今天給大家分享下升級過程,填一填這些坑!
SpringBoot實戰電商專案mall(50k+star)地址:https://github.com/macrozheng/mall
聊聊SpringBoot版本
首先我們來聊聊SpringBoot的版本,目前最新版本是2.6.4
版本,2.7.x
即將釋出,2.4.x
及以下版本已經停止維護了,目前的主流版本應該是2.5.x
和2.6.x
。具體可以看下下面這張表。
升級過程
下面我們將之前的mall-tiny-swagger
專案升級下,看看到底有哪些坑,這些坑該如何解決!
新增依賴
首先在pom.xml
中修改SpringBoot的版本號,注意從2.4.x
版本開始,SpringBoot就不再使用.RELEASE
字尾了。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
迴圈依賴
- 啟動專案後,由於SpringBoot禁止了
迴圈引用
,我們會遇到第一個問題,securityConfig
和umsAdminServiceImpl
迴圈引用了,具體日誌如下;
- 具體來說就是我們的
SecurityConfig
引用了UmsAdminService
;
- 而
UmsAdminServiceImpl
又引用了PasswordEncoder
;
- 由於
SecurityConfig
繼承了WebSecurityConfigurerAdapter
,而Adapter又引用了PasswordEncoder
,這樣就導致了迴圈引用。
- 要解決這個問題其實很簡單,你可以修改
application.yml
直接允許迴圈引用,不過這個方法有點粗暴,在沒有其他方法的時候可以使用;
spring:
main:
allow-circular-references: true
- 其實迴圈引用主要是因為會導致Spring不知道該先建立哪個Bean才會被禁用的,我們可以使用
@Lazy
註解指定某個Bean進行懶載入就可以優雅解決該問題,比如在SecurityConfig
中懶載入UmsAdminService
。
啟動出錯
- 再次啟動SpringBoot應用後會出現一個空指標異常,一看就是Swagger問題,原來挺好用的Swagger不能用了!
- 在Swagger的配置類中新增如下Bean可以解決該問題;
/**
* Swagger2API文件的配置
*/
@Configuration
public class Swagger2Config {
@Bean
public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
return new BeanPostProcessor() {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
}
return bean;
}
private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
List<T> copy = mappings.stream()
.filter(mapping -> mapping.getPatternParser() == null)
.collect(Collectors.toList());
mappings.clear();
mappings.addAll(copy);
}
@SuppressWarnings("unchecked")
private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
try {
Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
field.setAccessible(true);
return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new IllegalStateException(e);
}
}
};
}
}
文件無法顯示
- 再次啟動後訪問Swagger文件,會發現之前好好的文件也無法顯示了,訪問地址:http://localhost:8088/swagger...
- 修改
application.yml
檔案,MVC預設的路徑匹配策略為PATH_PATTERN_PARSER
,需要修改為ANT_PATH_MATCHER
;
spring:
mvc:
pathmatch:
matching-strategy: ANT_PATH_MATCHER
- 再次啟動後發現Swagger已經可以正常使用了!
聊聊springfox
提到Swagger,我們一般在SpringBoot中整合的都是springfox給我們提供的工具庫,看了下官網,該專案已經快兩年沒有釋出新版本了。
再看下Maven倉庫中的版本,依舊停留在之前的3.0.0
版本。如果springfox再不出新版本的話,估計隨著SpringBoot版本的更新,相容性會越來越差的!
總結
今天帶大家體驗了一把SpringBoot升級2.6.x
版本的過程,主要解決了迴圈依賴和Swagger無法使用的問題,希望對大家有所幫助!
如果你想了解更多SpringBoot實戰技巧的話,可以試試這個帶全套教程的實戰專案(50K+Star):https://github.com/macrozheng/mall
參考資料
官網地址:https://github.com/springfox/...