Spring-boot:Filter用main方法可以啟動,但是放到tomcat下面不能啟動
阿新 • • 發佈:2019-02-12
public class RedirectFilter implements Filter { @AutowiredAppSetting webAppSetting @Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("SysContentFilter inited."); }@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {String rootDir = webAppSetting.getRootDir(); ..... } catch (Exception ex) {log.error(ex.getMessage()); }chain.doFilter(request, response); }}在本地使用main方法啟動,該類可以正常啟動;當將該類打成war包之後,放到tomcat上面啟動,發現無法啟動成功。分析原因:String rootDir = webAppSetting.getRootDir();webAppSetting等於null,導致啟動失敗但是在本地啟動時,webAppSetting是已經在spring啟動時已經通過@Autowired注入到spring容器中了,在使用是通過時已經例項化成功,可以直接使用。但是在tomcat中,分析情況,webAppSetting應該不在spring容器中,沒有被例項化過,所以會出現null的情況。為什麼會出現這種情況呢?在spring中有這樣的情況出現:spring對Filter和Servlet無法使用自動注入屬性解決方法本地可以啟動成功的原因:但是在spring-boot中,是可以對Filter和Servlet進行自動注入的。所以再spring-boot用main方法啟動的時候,Filter方法是可以被自動注入的。而webAppSetting也是受到spring容器管理的,所以本地啟動時,沒有任何報錯。 tomcat不能啟動的原因:tomcat啟動時,Filter是可以被tomcat容器注入的,但是webAppSetting時受到spring容器管理的,在tomcat容器載入時,Filter就使用到spring容器管理的bean,此時spring容器還沒有開始初始化,此時webAppSetting還沒有被spring容器例項化,所以導致了webAppSetting.getRootDir()中的webAppSetting為null,導致Filter載入時報錯,tomcat啟動失敗。解決方法:刪除掉@AutowiredAppSetting webAppSetting 在使用webAppSetting的地方對其進行例項化。通過手工的方式得到webAppSetting物件AppSetting webAppSetting = AppContext.getBean(AppSetting.class);public class RedirectFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("SysContentFilter inited."); }@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {AppSetting webAppSetting = AppContext.getBean(AppSetting.class);String rootDir = webAppSetting.getRootDir(); ..... } catch (Exception ex) {log.error(ex.getMessage()); }chain.doFilter(request, response); }}