1. 程式人生 > 其它 >springboot 過濾器中使用@Autowired 為空 以及 使用 @Value 無法讀取yml配置的問題解決

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

問題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);
        RedisUtil redisUtil = ctx.getBean(RedisUtil.class);
Environment environment = ctx.getBean(Environment.class); String oauthOpen = environment.getProperty("oauth.open"); if("true".equals(oauthOpen)){ long expireTime = redisUtil.getExpire(CommonConstant.PREFIX_USER_TOKEN + token); //如果即將過期時間小於設定過期時間的十分之一(3分鐘),就重新再賦值過期時間 if(expireTime <= JwtUtil.EXPIRE_TIME/1000/10 && expireTime>0){ LoginUser loginAuthUser = (LoginUser) redisUtil.get(CommonConstant.PREFIX_AUTH_USER + token); redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME/1000 ); redisUtil.set(CommonConstant.PREFIX_AUTH_USER + token, loginAuthUser); redisUtil.expire(CommonConstant.PREFIX_AUTH_USER + token, JwtUtil.EXPIRE_TIME/1000); } }

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

百度之後知道:

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

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

Environment environment = ctx.getBean(Environment.class);
String oauthOpen = environment.getProperty("oauth.open");