我使用Jersey 1.4 ea和Spring 3.0以及jersey-spring
集成。集成Jersey和Spring适用于资源类,如here所述。
我怎么想将一个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?
更新
有点解决了。问题是如果这些bean是Java代理(与生成的代理类相对),Jersey不会获得Spring bean。通过在Spring配置的各个部分中指定proxy-target-class="true"
属性,指示Spring始终使用代理类而不是Java代理,可以解决该问题。在我的场景中,我必须在<tx:annotation-driven proxy-target-class="true" />
上指定它。
有关更详细的分析和可能的解决方法,请参阅here。
答案 0 :(得分:2)
我在Jersey 1.6和Spring 3.0.5上看到了同样的东西。使用调试器,我可以说,即使我的代码用@Component标记,Spring和Jersey都会实例化它们自己的这个类的副本:
@Path("/beams")
@Produces("text/xml")
@Component
@Scope("singleton")
public class BeamsResource {
}
有一些喋喋不休的说法,这将在未来的泽西版本中添加,但它现在似乎没有奏效。我知道这是一个可怕的解决方案,但我正在使用一个静态成员变量暂时将Jersey和Spring挂钩。的Bleh。