關於 springboot 過濾器中使用@Autowired 爲空 以及 使用 @Value 無法讀取yml配置的問題解決

前言

最近在負責做鑑權認證這一塊,初學遇到很多問題,特別是天天都出現的空指針異常。
廢話不多說,說說我遇到的問題。

....
@Slf4j
public class JWTAuthorizationFilter extends BasicAuthenticationFilter {
	@Autowired
    private SysUserDao sysUserDao;
    ....

問題1 :在過濾器中使用 @Autowired 爲null

經過百度之後,知道

Spring中,web應用啓動的順序是:listener->filter->servlet,先初始化listener,然後再來就filter的初始化,再接着纔到我們的dispathServlet的初始化,因此,當我們需要在filter裏注入一個註解的bean時,就會注入失敗,因爲filter初始化時,註解的bean還沒初始化,沒法注入。

簡答理解:過濾器的生命優先級比較高,還沒加載後面的bean之類的東西,spring無法幫你注入

解決方法:

//獲取容器
ServletContext context = request.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);

bean xxx = ctx.getBean(bean.class);

問題2:過濾器使用 @Value 爲null

使用過多種方法,我的大概理解和上面的原因一樣,不知道對不對,有沒有高手指錯。
問了小夥伴之後,推薦我去用 Environment

百度之後知道:

Environment 用來表示整個應用運行時的環境,爲了更形象地理解Environment,你可以把Spring應用的運行時簡單地想象成兩個部分:一個是Spring應用本身,一個是Spring應用所處的環境。

如此一來可以簡單試試看,利用上面的方法獲取bean,然後讀取yml文件:

Environment environment = ctx.getBean(Environment.class);

String jasyptSecretKey = environment.getProperty("jwt.secretkey");

就此,解決了我的兩個難題,希望可以幫到陌生人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章