让 Spring 了解 Jersey 过滤器

Posted

技术标签:

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

我有一个实现 ContainerRequestFilter 的类,我想向其中注入一些 spring 依赖项,所以我需要。过滤器本身在我的 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 的任何建议?

【问题讨论】:

【参考方案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 配置的过滤器的方式。

【讨论】:

以上是关于让 Spring 了解 Jersey 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + Jersey 类型过滤器 - 服务的错​​误请求 400 消耗 MULTIPART_FORM_DATA

Jersey JAX-RS + Spring 安全应用示例

泽西岛和过滤器异常处理

Servlet 过滤器和 Jersey 过滤器有啥区别?

Jersey 的 servlet 或过滤器

Jersey 3.0 没有选择 NameBinding 响应过滤器