spring使用AbstractSecurityWebApplicationInitializer

时间:2016-04-21 07:05:35

标签: java xml spring spring-mvc

我的 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中的过滤器没有似乎工作?

2 个答案:

答案 0 :(得分:0)

DelegatingFilterProxy是委托给spring托管bean的代理。在您的情况下,应在容器中注册的bean的名称为webContextFilterBean应该实现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 {
}