【问题标题】:Making Spring aware of Jersey filter让 Spring 了解 Jersey 过滤器
【发布时间】:2013-03-12 13:20:39
【问题描述】:

我有一个实现 ContainerRequestFilter 的类,我想向其中注入一些 spring 依赖项,所以我需要让 Spring 了解 Jersey 过滤器。过滤器本身在我的 web.xml 中配置了 Jersey servlet

<servlet>
    <servlet-name>Jersey Spring Web Application</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.MyFilter</param-value>
    </init-param>
</servlet>

过滤器类然后尝试注入 Manager bean。为了让 spring 了解 Filter bean,我在 applicationContext.xml 中定义了 bean 并包含在内。

@Component
public class MyFilter implements ContainerRequestFilter {

@Autowired
private Manager manager;

我试图通过强制 Spring 使用代理生成的类来使过滤器 bean 可见,但这不起作用

<mvc:annotation-driven />

<aop:aspect-autoproxy />    

<bean id="filter" class="com.MyFilter">
    <property name="manager" ref="Manager" />
</bean>

关于如何编辑现有代码以允许过滤器查看 spring bean 的任何建议?

【问题讨论】:

    标签: spring jersey servlet-filters


    【解决方案1】:

    由于您使用的是 Jersey 的 Spring Servlet,因此可以使用注解 @InjectParam 将 spring 依赖项注入到过滤器中

    //@Component -> This is not required.
    public class MyFilter implements ContainerRequestFilter {
    
    @InjectParam
    private Manager manager;
    

    我觉得这是结合使用 Jersey 和 Spring 的惯用方式。

    【讨论】:

    • @InjectParam 对我有用,但如果我从 web.xml 中删除 &lt;param-value&gt;,泽西岛不会加载过滤器。
    • 当我添加 @InjectParam 时,我得到一个 SEVERE: missing dependency 错误;使用 @Inject 从 Spring 注入资源类有效(但容器过滤器中未提取 @Inject)。有没有我遗漏的步骤?
    【解决方案2】:

    这在 Spring Security 应用程序中很常见。您应该为此使用DelegatingFilterProxy

    您将通过&lt;filter&gt; 标记将此过滤器添加到您的web.xml,然后将其配置为应用程序容器中的bean。然后,您可以使用它来委托给您在应用程序上下文中拥有的 Spring 配置过滤器。

    我不熟悉 Jersey 的 SpringServlet 的工作方式,但这就是我委托给 Spring 配置的过滤器的方式。

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2020-07-08
      • 2016-10-23
      • 2013-05-28
      • 1970-01-01
      相关资源
      最近更新 更多