Spring-boot:Filter用main方法可以启动,但是放到tomcat下面不能启动

public class RedirectFilter implements Filter {
      @ Autowired
        AppSetting webAppSetting 
       @Override
       public void init(FilterConfig filterConfig ) throws ServletException {
             log .info( "SysContentFilter inited." );
      }
       @Override
       public 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启动失败。

解决方法:
删除掉
@ Autowired
AppSetting webAppSetting 

在使用webAppSetting的地方对其进行实例化。
通过手工的方式得到 webAppSetting对象
AppSetting webAppSetting = AppContext . getBean (AppSetting. class );


public class RedirectFilter implements Filter {
       @Override
       public void init(FilterConfig filterConfig ) throws ServletException {
             log .info( "SysContentFilter inited." );
      }
       @Override
       public 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 );
      }
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值