最近在給同事調試項目時,發現一個問題,在Security Success 回調邏輯中調用RequestContextHolder.currentRequestAttributes() 出現報錯:
caused by :java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
出現這個問題時,根據字面意思以為是回調的Request不在同一個線程,也與其他項目進行了比較,依舊無果,浪費了不少腦細胞。。。
在Debug跟進代碼查看時發現沒有加載RequestContextFilter(在SpringBoot中@EnableAutoConfiguration會創建該對象)對象,又翻了一遍項目發現配置了@EnableWebMvc + extends WebMvcConfigurationAdapter,這個會使SpringBoot的@EnableAutoConfiguration失效,----- 問題找到啦 👏👏👏
因為有些項目需要添加自己的一些配置,所以需要重寫一些啟動配置邏輯,大概分為以下3種:
1、@EnableWebMvc + extends WebMvcConfigurationAdapter,在擴展的類中重寫父類的方法即可,這種方式會屏蔽SpringBoot的@EnableAutoConfiguration
2、extends WebMvcConfigurationSupport,在擴展的類中重寫父類的方法即可,這種方式會屏蔽SpringBoot的@EnableAutoConfiguration
3、extends WebMvcConfigurationAdapter,在擴展的類中重寫父類的方法即可,這種方式則不會屏蔽SpringBoot的@EnableAutoConfiguration
具體使用哪種還是根據項目需要來選擇。
就此,填坑結束!!!
