web.xml:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.mypackage.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/myFilterPattern/*</url-pattern>
</filter-mapping>
我的过滤器:
public class MyFilter implements Filter {
@Autowired
InjectedBean someInjectedBean;
但是,拦截/myFilterPattern/*
请求时,MyFilter.doFilter(...)
中的someInjectedBean
仍然为null,也就是说尚未注入(inject)。相同的 bean (InjectedBean
) 可以很好地注入(inject)到 web.xml 中未引用的其他上下文组件中。
是因为容器过滤发生在 Spring 上下文之外吗?有什么方法可以将 Filter 实现中的 Spring 注入(inject)映射到 web.xml 中吗?
最佳答案
由于 Filter 不是 spring bean(它是一个 Web 组件),因此注入(inject)无法在其中工作。 Springs 不会注入(inject)到 Web 组件内部。
使用 DelegatingFilterProxy,这是一个过滤器实现,它将 springbean 名称作为初始化参数,并将过滤器请求委托(delegate)给该 bean。
<filter>
<filter-name>myFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>myFilterBean</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/myFilterPattern/*</url-pattern>
</filter-mapping>
并在 Spring 上下文中创建一个名为 myFilterBean 的 Bean。
public class MyFilter extends GenericFilterBean {
@Autowired
InjectedBean someInjectedBean;
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
}
}
关于java - web.xml 中映射的 Filter 实现中的 Spring 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43769781/