我的 web.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
的子类,它本身创建了根应用程序上下文。 / p>
当我在 tomcat7 下运行时,我得到了一个
SEVERE:启动webContextFilter的异常 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有 名为'webContextFilter'的bean已定义
applicationContext.xml
包含相应的component-scan
定义,因此不是问题。
我猜可能在创建DelegatingFilterProxy时,AbstractSecurityWebApplicationInitializer
的上下文加载器尚未启动?
我该如何解决这个问题?
EDIT1 :webContextFilter
bean位于正确的包中,即context:component-scan
中列出的bean的子包,并且bean被定义为
@Component("webContextFilter")
public class WebContextFilter extends OncePerRequestFilter {
// ...
}
bean位于WEB-INF / lib / xyz.jar中。当在web.xml中取消注释JBoss resteasy SpringContextLoaderListener
时,这一切都在tomcat6下工作。
EDIT2:也许我的问题归结为:当使用AbstractSecurityWebApplicationInitializer
创建根上下文时,如何指定其他过滤器,因为web.xml中的过滤器没有似乎工作?
答案 0 :(得分:0)
DelegatingFilterProxy
是委托给spring托管bean的代理。在您的情况下,应在容器中注册的bean的名称为webContextFilter
。 Bean
应该实现Filter
接口。摘录摘自javadoc
DelegatingFilterProxy
标准Servlet 2.3过滤器的代理,委托给 Spring管理的* bean,用于实现Filter接口。支持 一个“targetBeanName”*在{@code web.xml}中过滤init-param,指定 Spring应用程序上下文中* target bean的名称。 * *
{@ code web.xml}通常包含{@code DelegatingFilterProxy}定义*,带有指定的{@code filter-name}对应于* Spring根目录中的bean名称 应用背景。所有对过滤器代理的调用将是* 在Spring上下文中委托给那个bean,这是必需的 实现*标准的Servlet 2.3过滤器接口。 * *
这个 方法对于具有复杂性的Filter实现特别有用 *设置需求,允许将完整的Spring bean定义机制应用于* Filter实例。或者,考虑标准 组合过滤器设置*与查找服务bean Spring root应用程序上下文。
如果您的上下文中有此bean,请使用bean声明更新您的问题并告知您正在使用的容器数量
答案 1 :(得分:0)
问题是没有读取applicationContext.xml,所以我在@ImportResource
类定义中添加了SecurityConfig
注释。
@Configuration
@ImportResource("/WEB-INF/applicationContext.xml")
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}