Введите EJB в JAX-RS (УСПОКОИТЕЛЬНЫЙ сервис)

Я пытаюсь ввести EJB Не сохраняющий состояние в свой веб-сервис JAX-RS с помощью аннотаций. К сожалению, EJB справедлив null и я получаю a NullPointerException когда я пытаюсь использовать его.

@Path("book")
public class BookResource {

    @EJB
    private BookEJB bookEJB;

    public BookResource() {
    }

    @GET
    @Produces("application/xml")
    @Path("/{bookId}")
    public Book getBookById(@PathParam("bookId") Integer id)
    {
        return bookEJB.findById(id);
    }
}

Что я делаю неправильно?

Вот некоторая информация о моей машине:

  • Glassfish 3.1
  • Netbeans 6.9 RC 2
  • Java EE 6

Можете Вы парни показывать некоторый рабочий пример?

70
задан Jens Piegsa 27 April 2015 в 10:38
поделиться

1 ответ

Я не уверен, что это должно сработать. Итак, либо:

Вариант 1: Используйте SPI провайдера внедрения

Реализуйте провайдера, который будет выполнять поиск и внедрять EJB. См .:

Пример для com.sun.jersey: jersey-server: 1.17:

import com.sun.jersey.core.spi.component.ComponentContext;
import com.sun.jersey.core.spi.component.ComponentScope;
import com.sun.jersey.spi.inject.Injectable;
import com.sun.jersey.spi.inject.InjectableProvider;

import javax.ejb.EJB;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.ws.rs.ext.Provider;
import java.lang.reflect.Type;

/**
 * JAX-RS EJB Injection provider.
 */
@Provider
public class EJBProvider implements InjectableProvider<EJB, Type> {

    public ComponentScope getScope() {
        return ComponentScope.Singleton;
    }

    public Injectable getInjectable(ComponentContext cc, EJB ejb, Type t) {
        if (!(t instanceof Class)) return null;

        try {
            Class c = (Class)t;
            Context ic = new InitialContext();

            final Object o = ic.lookup(c.getName());

            return new Injectable<Object>() {
                public Object getValue() {
                    return o;
                }
            };
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

Вариант 2: Сделайте BookResource EJB

@Stateless
@Path("book")
public class BookResource {

    @EJB
    private BookEJB bookEJB;

    //...
}

См .:

Вариант 3: использование CDI

@Path("book")
@RequestScoped
public class BookResource {

    @Inject
    private BookEJB bookEJB;

    //...
}

См .:

112
ответ дан 24 November 2019 в 13:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: