无法覆盖或禁用弹簧启动实例化的筛选器,导致筛选器链中存在重复项



我有一个组件类:

public class FooFilter implements Filter {
private FooService fooService; //spring-injected dependency
@Override public void init(FilterConfig filterConfig) {}
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){}
@Override public void destroy() {}
}

在springConfigured.xml:中定义

<context:spring-configured />
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean class="com.foo.filter.FooFilter" scope="prototype" autowire="byType"/>
</beans>

过滤器在我们的过滤器链中使用FilterRegistrationBean:进行配置

@Configuration
public class FooFilterRegistrationConfig {
private List<String> URL_PATTERNS = Arrays.asList("foo", "bar");
@Bean
public FilterRegistrationBean fooFilter(FooFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(filter);
registration.setName("FooFilter");
registration.setUrlPatterns(URL_PATTERNS);
registration.setOrder(4);
return registration;
}
//and some more
}

使用这个设置,我们的过滤器链中有两个FooFilter。日志:

//a bunch of filters
2017-10-16 16:34:37,468 [RMI TCP Connection(3)-127.0.0.1] INFO  servlet.FilterRegistrationBean - Mapping filter: 'FooFilter' to urls: [*.jsp, *.do, *.faces, *.action, /mvc/*]
//some more filters
2017-10-16 16:34:37,468 [RMI TCP Connection(3)-127.0.0.1] INFO  servlet.FilterRegistrationBean - Mapping filter: 'com.foo.web.filter.FooFilter#0' to: [/*]

对于此类问题的其他一些答案建议使用RegistrationConfig禁用筛选器。如果我尝试使用registration.setEnabled(false)禁用FilterRegistrationConfig中的筛选器,那么最后我仍然会得到额外的筛选器。

2017-10-16 16:22:46,078 [RMI TCP Connection(3)-127.0.0.1] INFO  servlet.FilterRegistrationBean - Filter FooFilter was not registered (disabled)
...
2017-10-16 16:22:46,079 [RMI TCP Connection(3)-127.0.0.1] INFO  servlet.FilterRegistrationBean - Mapping filter: 'com.foo.filter.FooFilter#0' to: [/*]

我已经尝试在FilterRegistrationConfig中完全删除对此过滤器的引用,并直接在FooFilter类上使用@Order注释,但因为我们在xml中指定了这个bean,而没有使用组件扫描,所以我似乎无法获得@WebFilter注释来正确应用Url模式。

任何关于如何摆脱我的过滤器链中创建的FooFilter#0的提示都将不胜感激!

编辑:

我已经尝试从xml中删除bean定义。现在我无法将其注入FilterRegistrationBean方法,因为这会导致"找不到‘FooFilter’类型的bean"错误。

@Bean
public FilterRegistrationBean fooFilter(FooFilter filter) { //no beans of 'FooFilter' type found
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(filter);
registration.setName("FooFilter");
registration.setUrlPatterns(URL_PATTERNS);
registration.setOrder(4);
return registration;
}

然而,如果我在这里手动实例化FooFilter,我稍后会遇到问题,因为FooFilter包含许多未注入的弹簧管理依赖项:

@Bean
public FilterRegistrationBean fooFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new FooFilter()); //works fine here, but Spring does not inject dependencies into this object I created, so null pointers later
registration.setName("FooFilter");
registration.setUrlPatterns(URL_PATTERNS);
registration.setOrder(4);
return registration;
}

FilterRegistrationBean创建您的FooFilterbean,您不必单独创建它,Remove-bean for FooFilter(下面一行)

<bean class="com.foo.filter.FooFilter" scope="prototype" autowire="byType"/>

注:当spring容器创建bean FilterRegistrationBean时,它还创建了一个bean FooFilter,正如您所提到的
注册.setName("FooFilter");//FooFilter是bean 的名称

最新更新