Dan*_*lan 5 java jersey cdi glassfish-3 jersey-1.0
我想我是在问这个问题,但对于 Jersey 1.x: Dependency injection with Jersey 2.0
我正在使用 Glassfish 3、CDI 和 Jersey 1.x。我有一个@WebService正在注入这样的类:
@Inject
Foo foo;
Run Code Online (Sandbox Code Playgroud)
我已经在 中测试了@WebService它并且它有效。但是我的 Jersey 资源中的同一行代码在尝试使用foo. 我认为 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>
Run Code Online (Sandbox Code Playgroud)
我在这里找到了一些帮助。问题是我Foo @Inject自己的 bean(它们实际上是来自其中的类的 EJB @Provides)。 resourceContext.getResource(Foo.class);返回 的实例Foo,但foo的@Injected 字段为空。
我找到了一篇文章,解释了如何做到这一点:
这里的问题是,CDI 没有到位来实例化依赖项。他们的[原文如此]是针对这个问题的两种解决方案:
- 让 CDI 实例化依赖项,但让 Jersey 管理它 这可以使用
@ManagedBean和 Jersey 特定的注释来实现。- 让 CDI 实例化依赖项并让 CDI 管理它。这可以使用
@RequestScoped或其他 CDI 特定注释来实现。
我选择了第一个选项并将javax.annotation.ManagedBean注释放在我的资源上。 这是一个例子:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
*我还发现了这篇官方文章,实际上并没有那么有用:http : //docs.oracle.com/javaee/7/tutorial/doc/jaxrs-advanced004.htm