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
的上下文加载程序可能还没有启动??
我该怎么解决这个问题?
EDIT1:webContextFilter
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的名称是webContextFilter
。Bean
应实现Filter
接口。摘录自DelegatingFilterProxy
的javadoc
标准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声明更新您的问题,并告诉您正在使用的容器数量