springboot Filter中無法注入Bean對象的解決辦法



這次在項目中編寫Token代碼邏輯的時候,遇到了一個空指針問題,經過排查發現,Filter里面無法利用@Autowired。
所以此次文章用來解決這一問題。

經過查閱資料發現,spring容器初始化Bean的順序是Listener->Filter->servlet.
那么我可以在Listener里面預先加載我們想要的Bean對象,然后經過Filter構造函數將對象傳進去。

下面是具體的代碼:

這個是啟動監聽器。

@Slf4j
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public class StartLinster implements ApplicationListener<ApplicationEvent> {

    @Autowired
    TokenService tokenService;

    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        log.info("提前注入token");
    }
}

里面TokenService是Service層,也是我們想要注入的對象。

這個是Filter啟動的相應代碼,可以看到,Listener啟動順序是最高的。

@Bean
   public FilterRegistrationBean<AuthenticationFilter> initAuthenticationFilter(TokenService tokenService){


       FilterRegistrationBean<AuthenticationFilter> authenticationFilterFilter = new FilterRegistrationBean<>();
       AuthenticationFilter authenticationFilter = new AuthenticationFilter(tokenService);

       authenticationFilter.addExcludePatterns("/api/user/login");

       authenticationFilterFilter.setFilter(authenticationFilter);

       authenticationFilterFilter.setOrder(Ordered.LOWEST_PRECEDENCE);

       authenticationFilterFilter.addUrlPatterns("/api/*");

       return authenticationFilterFilter;
   }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM