spring DemissionatingFilterProxy 在使用 AbstractSecurityWebApplicationInitializer 时在 web 中找不到过滤器名称 bean



Myweb.xml看起来像这个

<!--listener>
    <listener-class>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener</listener-class>
</listener-->
<filter>
    <filter-name>webContextFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>webContextFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我注释掉了上面的JBoss SpringContextLoaderListener以避免IllegalStateException,因为我在其他地方使用AbstractSecurityWebApplicationInitializer的子类(来自强制库),它本身创建了根应用程序上下文。

当我在tomcat7下运行此程序时,我会得到

严重:启动webContextFilter时出现异常org.springframework.beans.factory.NoSuchBeanDefinitionException:否名为"webContextFilter"的bean已定义

applicationContext.xml包含适当的component-scan定义,所以这不是问题所在。

我猜创建DelegatingFilterProxy时,AbstractSecurityWebApplicationInitializer的上下文加载程序可能还没有启动??

我该怎么解决这个问题?

EDIT1webContextFilter bean在正确的包中,即context:component-scan中列出的子包中,并且bean被定义为

@Component("webContextFilter")
public class WebContextFilter extends OncePerRequestFilter {
// ...
}

该bean位于WEB-INF/lib/xyz.jar中。当JBoss resteasy SpringContextLoaderListener在WEB.xml中被取消注释时,这一切都曾在tomcat6下工作。

EDIT2:也许我的问题可以归结为:当使用AbstractSecurityWebApplicationInitializer创建根上下文时,由于web.xml中的过滤器似乎不起作用,我如何指定其他过滤器?

问题是applicationContext.xml没有被读取,所以我在SecurityConfig类定义中添加了@ImportResource注释。

@Configuration
@ImportResource("/WEB-INF/applicationContext.xml")
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}

DelegatingFilterProxy是一个代理,它将委托给spring托管bean。在您的案例中,应该在容器中注册的bean的名称是webContextFilterBean应实现Filter接口。摘录自DelegatingFilterProxyjavadoc

标准Servlet 2.3筛选器的代理,委托给实现Filter接口的Spring托管*bean。支架{@code-web.xml}中的"targetBeanName"*筛选器init param,指定Spring应用程序上下文中的*目标bean的名称。**

{@code-web.xml}通常会包含一个{@code DelegatingFilterProxy}定义,*带有指定的{@codefilter name}对应于*Spring根目录中的bean名称应用程序上下文。所有对筛选器代理的调用将*在Spring上下文中委托给该bean实现*标准Servlet 2.3 Filter接口。**

这个该方法对于具有复杂*setup需要,允许将完整的Springbean定义机制应用于*Filter实例。或者,考虑标准过滤器设置与从Spring根应用程序上下文。

如果您的上下文中有这个bean,那么请使用bean声明更新您的问题,并告诉您正在使用的容器数量

最新更新