Can I use CDI to @Inject a class in Jersey 1.x?

2019-07-06 23:56发布

问题:

I think I'm asking this question but for Jersey 1.x: Dependency injection with Jersey 2.0

I'm using Glassfish 3, CDI and Jersey 1.x. I have a @WebService that is injecting a class like this:

@Inject
Foo foo;

I've tested this in the @WebService and it works. But the same line of code in my Jersey resource throws a NPE when it tries to use foo. I think Jersey 1.x is ignoring the CDI annotations. How can I get dependency injection working like it does in my @WebService?

Foo is a pojo and my web.xml is using the ServletContainer:

<servlet>
    <servlet-name>JerseyServlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>

I've found some help here. The problem is my Foo @Injects its own beans (they're actually EJBs that come from a class with @Provides in it). resourceContext.getResource(Foo.class); returns an instance of Foo, but foo's @Injected fields are null.

回答1:

I found an article that explains how to do this:

The problem here is, that CDI isn’t in place to instantiate the dependency. Their[sic] are two solutions for this problem:

  1. Let CDI instantiate the dependency, but let Jersey managed it This can be achived using @ManagedBean and a Jersey specific annotation.
  2. Let CDI instantiate the dependency and let CDI manage it. This can be achieved using @RequestScoped or other CDI specific annotations.

I chose the first option and put the javax.annotation.ManagedBean annotation on my resource. 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);
    }
}

* Also I found this official article, which actually isn't as useful: http://docs.oracle.com/javaee/7/tutorial/doc/jaxrs-advanced004.htm