所以,我有一个tomcat 8 + jersey 2.5.1 +焊接CDI应用程序,在大多数情况下效果很好。它失败的地方是我无法用CDI拦截器拦截泽西资源方法调用。这是有道理的,因为泽西资源类不是CDI bean。那么,有没有办法让CDI拦截器在球衣上工作?提出这个问题的另一种方法:CDI bean可以用作泽西岛资源吗?
谢谢!
修改 在使用Jersey编写RESTful资源之前,我有用于开始和提交数据库事务的CDI拦截器。我真的需要遵循相同或类似的模式,在我的RESTful球衣资源中实现这种横切交易注入。这是提出这个问题的主要原因。
再次感谢!
答案 0 :(得分:2)
CDI bean可以用作泽西岛资源吗?
是的,但是由于泽西岛的DI基于hk2而不是CDI,你需要一座桥梁。
在glassfish中,这样的桥梁由模块jersey-gf-cdi
实现:
<dependency>
<groupId>org.glassfish.jersey.containers.glassfish</groupId>
<artifactId>jersey-gf-cdi</artifactId>
<version>2.6</version>
</dependency>
模块自动注册并且可以很好地处理Tomcat(假设你已经正确地引导了Jersey和Weld)。
不幸的是,2.6之前的版本只依赖于JNDI,在Tomcat不允许的'java:comp / BeanManager'下搜索提供者。
此行为的修复程序适用于2.6(我之前提出的拉取请求),并且可以回到CDI.current().getBeanManager()
。
我在Tomcat 7上测试过它并且工作正常,也应该在Tomcat 8上运行。
答案 1 :(得分:0)
Adam Bien在一个presentation中建议您将服务(CDI或EJB)类与RESTful资源类分开。他的理由是RESTful类通常使用Jersey注入的HttpHeaders但在CDI或EJB容器中不可用。如果像JSF框架这样的CDI客户端使用它,那么你的RESTful类可能会被注入HttpHeaders的Null引用。
感谢您自己回答的问题。您刚刚展示了第二个用例来验证Adam Bien的建议。
只需将它们分开!