我可以在Jersey 1.x中使用CDI来@Inject一个类吗?

时间:2014-04-10 16:43:40

标签: java jersey glassfish-3 cdi jersey-1.0

我想我问的是这个问题,但对于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字段为空。

1 个答案:

答案 0 :(得分:3)

我发现an article解释了如何执行此操作:

  

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

     
      
  1. 让CDI实例化依赖关系,但让Jersey管理它   这可以使用@ManagedBean和泽西特定注释来实现。
  2.   
  3. 让CDI实例化依赖关系并让CDI管理它。   这可以使用@RequestScoped或其他CDI特定注释来实现。
  4.   

我选择了第一个选项并将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