3

我有一个实现 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 的任何建议?

4

2 回答 2

8

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

//@Component -> This is not required.
public class MyFilter implements ContainerRequestFilter {

@InjectParam
private Manager manager;

我觉得这是一起使用 Jersey 和 Spring 的惯用方式。

于 2013-09-11T04:27:40.197 回答
4

这对于 Spring Security 应用程序来说是很常见的。你应该利用DelegatingFilterProxy这个。

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

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

于 2013-03-22T15:54:00.517 回答