我想从OncePerRequestFilter类访问一个spring组件,但是当我访问服务时我得到空指针,我认为原因就是配置。 我认为由于配置原因,在Spring调度程序servlet之前调用了过滤器。完成任务的好方法,请提出建议。
def copy_metadata(path)
st = lstat()
if !st.symlink?
File.utime st.atime, st.mtime, path
end
begin
if st.symlink?
begin
File.lchown st.uid, st.gid, path
rescue NotImplementedError
end
else
File.chown st.uid, st.gid, path
end
rescue Errno::EPERM
# clear setuid/setgid
... omitted ...
end
end
并且记录器为“authCheckService”打印null
答案 0 :(得分:2)
在你的init()OncePerRequestFilter中添加它,所以spring可以连接自动装配的bean
public void init(FilterConfig filterConfig) throws ServletException {
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
filterConfig.getServletContext());
}
答案 1 :(得分:2)
您正在Spring容器外部配置过滤器。因此,不会注入@Autowired依赖项。
要让Spring管理您的Filter bean而不通过使用建议的SpringBeanAutowiringSupport将它与Spring基础结构紧密耦合,您可以使用DelegatingFilterProxy抽象
将AuthCheckFilter过滤器定义为应用程序上下文中的bean,例如
@Bean
public Filter authCheckFilter(){
AuthCheckFilter filter = new AuthCheckFilter();
//supply dependencies
return filter;
}
然后在你的web.xml中用filter-class指定你的过滤器为org.springframework.web.filter.DelegatingFilterProxy,过滤器名称必须与上下文中的authCheckFilter bean名称相匹配
在运行时,DelegatingFilterProxy过滤器将委托给一个完全配置的bean,在上下文中使用名称为authCheckFilter(必须是过滤器)
<filter>
<filter-name>authFilterCheck</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>authCheckFilter</filter-name>
<url-pattern>/test/api/*</url-pattern>
</filter-mapping>
使用此设置,您不必担心过滤器,根上下文或servlet的生命周期
答案 2 :(得分:1)
我不知道为什么@Autowire不起作用,但我通过使用setter注入工作。
详情:
将其包含在applicationContext.xml文件中
<bean name="AuthCheckFilter" class="x.y.AuthCheckFilter">
<property name="authCheckService" ref="authCheckService"/>
</bean>
<bean name="authCheckService" class="x.y.AuthCheckService"/>
请记住在AuthCheck服务的AuthCheckFilter类中提供一个setter。
将此内容包含在您的web.xml中:
<filter>
<filter-name>AuthCheckFilter</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthCheckFilter</filter-name>
<url-pattern>/test/api/*</url-pattern>
</filter-mapping>
就是这样。现在,如果你点击了网址,你将获得非null的authCheckService。