Я пытаюсь ввести 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);
}
}
Что я делаю неправильно?
Вот некоторая информация о моей машине:
Можете Вы парни показывать некоторый рабочий пример?
Я не уверен, что это должно сработать. Итак, либо:
Вариант 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;
//...
}
См .: