让 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 中删除 <param-value>
,泽西岛不会加载过滤器。
当我添加 @InjectParam
时,我得到一个 SEVERE: missing dependency 错误;使用 @Inject
从 Spring 注入资源类有效(但容器过滤器中未提取 @Inject
)。有没有我遗漏的步骤?【参考方案2】:
这在 Spring Security 应用程序中很常见。您应该为此使用DelegatingFilterProxy
。
您将通过<filter>
标记将此过滤器添加到您的web.xml,然后将其配置为应用程序容器中的bean。然后,您可以使用它来委托给您在应用程序上下文中拥有的 Spring 配置过滤器。
我不熟悉 Jersey 的 SpringServlet
的工作方式,但这就是我委托给 Spring 配置的过滤器的方式。
【讨论】:
以上是关于让 Spring 了解 Jersey 过滤器的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot + Jersey 类型过滤器 - 服务的错误请求 400 消耗 MULTIPART_FORM_DATA