2010-09-19 107 views
5

我正在使用Jersey 1.4 ea和Spring 3.0以及jersey-spring集成。集成泽西岛和Spring对here描述的资源类别适用。 我怎么想要在ContainerRequestFilter中注入一个弹簧组件来做一些预处理请求。Jersey:将Spring组件注入ContainerRequestFilter

@Component 
public class SecurityFilter implements ContainerRequestFilter { 

    // UserManager is a declared spring component 
    // Injecting it should work somehow 
    @Autowired 
    private UserManager userManager; 

    @Override 
    public ContainerRequest filter(ContainerRequest request) { 
     System.out.println(userManager); 
     // prints out null on request 
    } 
} 

将应用程序部署到Glassfish时,过滤器和用户管理器bean都已注册。我想知道我做错了什么。有没有办法将Spring管理bean注入到ContainerRequestFilter中?

UPDATE

类的解决。问题是,如果这些bean是Java代理(与生成的代理类相对),Jersey不会获得Spring bean。通过指定Spring总是使用代理类而不是Java代理,可以通过在弹簧配置的相应部分中指定proxy-target-class="true"属性来解决问题。在我的场景中,我必须在<tx:annotation-driven proxy-target-class="true" />上指定它。

请参阅here了解更详细的分析和可能的解决方法。

+0

在你的解决方案中,SecurityFilter是如何在web.xml文件或其他地方注册的?我在这里有一个问题https://stackoverflow.com/q/45509183/4636715其中ContainerRequestFilter根本没有被访问。 – vahdet 2017-08-08 08:51:59

回答

2

我看到与泽西岛1.6和Spring 3.0.5相同的东西。使用调试器,我可以告诉大家,即使我的代码标有@Component,Spring和新泽西州将实例自己的这个类的副本:

@Path("/beams") 
@Produces("text/xml") 
@Component 
@Scope("singleton") 
public class BeamsResource { 
} 

有一番数落,这将在未来加入泽西岛的版本,但它现在似乎没有工作。我知道这是一个可怕的解决方案,但我使用静态成员变量来暂时将Jersey和Spring连接在一起。的Bleh。

+1

我终于遇到了这个解决方案。调试代码证明这是泽西如何从上下文中获得Spring bean的问题。我的想法记录在http://jersey.576304.n2.nabble.com/AW-Jersey-ContainerRequestFilter-as-Spring-component-td5724265.html – nre 2011-05-15 12:04:04

+0

请参阅我的问题的更新。 – nre 2011-05-15 12:15:09