我想我问的是这个问题,但对于Jersey 1.x:Dependency injection with Jersey 2.0
我使用的是Glassfish 3,CDI和Jersey 1.x.我有@WebService
注入这样的类:
@Inject
Foo foo;
我已在@WebService
中对此进行了测试,但它确实有效。但是我的Jersey资源中的同一行代码在尝试使用foo
时会抛出NPE。我认为Jersey 1.x忽略了CDI注释。如何使依赖注入像@WebService
一样工作?
Foo
是一个pojo,我的web.xml正在使用ServletContainer:
<servlet>
<servlet-name>JerseyServlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
我找到了some help here。问题是我的Foo
@Inject
它自己的bean(它们实际上是来自一个带有@Provides
的类的EJB)。 resourceContext.getResource(Foo.class);
返回Foo
的实例,但foo
的{{1}} ed字段为空。
答案 0 :(得分:3)
我发现an article解释了如何执行此操作:
这里的问题是,没有CDI来实例化依赖关系。 他们[原文如此]是解决这个问题的两种方法:
- 让CDI实例化依赖关系,但让Jersey管理它 这可以使用
@ManagedBean
和泽西特定注释来实现。- 让CDI实例化依赖关系并让CDI管理它。 这可以使用
醇>@RequestScoped
或其他CDI特定注释来实现。
我选择了第一个选项并将javax.annotation.ManagedBean
注释放在我的资源上。 Here's an example:
package com.coderskitchen.thegreeter.rest;
import com.coderskitchen.thegreeter.greetings.GreetingService;
import javax.annotation.ManagedBean;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@Path("/greet")
@ManagedBean
public class Greeter {
@Inject
GreetingService gs;
@GET
@Path("{name}")
public String greetSomeone(@PathParam("name") String name) {
return gs.greetSomeone(name);
}
}
*此外,我发现这篇官方文章实际上并没有那么有用:http://docs.oracle.com/javaee/7/tutorial/doc/jaxrs-advanced004.htm