Могу ли я использовать CDI для ввода класса в Джерси 1.x?

Я думаю, что задаю этот вопрос, но для Джерси 1.x: инъекция зависимости с Джерси 2.0

Я использую Glassfish 3, CDI и Jersey 1.x. у меня есть @WebService это вводит класс как это:

@Inject
Foo foo;

Я проверил это в @WebService и это работает. Но та же самая строка кода в моем ресурсе Джерси выдает NPE, когда он пытается использовать 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"s @Injectполя ed являются нулевыми.

1 ответ

Решение

Я нашел статью, которая объясняет, как это сделать:

Проблема здесь в том, что CDI не создан для создания зависимости. Их [так] два решения этой проблемы:

  1. Пусть CDI создает экземпляр зависимости, но пусть Джерси это удалось. Этого можно добиться, используя @ManagedBean и специфическая аннотация Джерси.
  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

Другие вопросы по тегам