【问题标题】:spring DelegatingFilterProxy can't find filter-name bean in web.xml when using AbstractSecurityWebApplicationInitializer使用 AbstractSecurityWebApplicationInitializer 时,spring DelegatingFilterProxy 在 web.xml 中找不到过滤器名称 bean
【发布时间】:2016-04-21 07:05:34
【问题描述】:

我的 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 的子类,它本身创建了根应用程序上下文。

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

【问题讨论】:

    标签: java xml spring spring-mvc


    【解决方案1】:

    DelegatingFilterProxy 是委托给 Spring 托管 bean 的代理。在您的情况下,应该在容器中注册的 bean 的名称是 webContextFilterBean 应该实现 Filter 接口。这段摘自javadocDelegatingFilterProxy

    标准 Servlet 2.3 过滤器的代理,委托给 Spring 管理的 * bean,实现了 Filter 接口。支持 {@code web.xml} 中的“targetBeanName”* 过滤器初始化参数,指定 * Spring 应用程序上下文中的目标 bean 的名称。 * *

    {@code web.xml} 通常包含一个 {@code DelegatingFilterProxy} 定义,* 带有指定的 {@code filter-name} 对应 * Spring 根目录下的一个 bean 名称 应用上下文。对过滤器代理的所有调用都将 * 是 在 Spring 上下文中委托给该 bean,这是必需的 实现 * 标准的 Servlet 2.3 Filter 接口。 * *

    这个 方法对于复杂的过滤器实现特别有用 * 设置需要,允许将完整的 Spring bean 定义机制应用于 * 过滤器实例。或者,考虑标准 过滤器设置结合 * 从 Spring 根应用上下文。

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

    【讨论】:

    • 我已添加 EDIT1。我不知道如何找到容器的数量。这是一个webapp,由WEB-INF/lib中的几个依赖jar组成。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-10
      • 2012-07-24
      • 2015-07-23
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 2011-12-23
      • 2015-08-28
      相关资源
      最近更新 更多