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
);
}
}