5

我想我是在问这个问题,但对于 Jersey 1.x: Dependency injection with Jersey 2.0

我正在使用 Glassfish 3、CDI 和 Jersey 1.x。我有一个@WebService正在注入这样的类:

@Inject
Foo foo;

我已经在 中对此进行了测试,@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>

我在这里找到了一些帮助。问题是我Foo @Inject自己的bean(它们实际上是来自其中的类的EJB @Provides)。 resourceContext.getResource(Foo.class);返回 的实例Foo,但foo@Injected 字段为空。

4

1 回答 1

5

我发现一篇文章解释了如何做到这一点:

这里的问题是,CDI 无法实例化依赖项。他们的[原文如此]是解决这个问题的两种方法:

  1. 让 CDI 实例化依赖项,但让 Jersey 管理它 这可以使用@ManagedBeanJersey 特定的注释来实现。
  2. 让 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);
    }
}

* 我还发现了这篇官方文章,实际上并没有那么有用:http ://docs.oracle.com/javaee/7/tutorial/doc/jaxrs-advanced004.htm

于 2014-04-10T18:10:49.517 回答