Инъекция @EJB не работает из сервиса JAX-RS в Websphere AS 8 - PullRequest
1 голос
/ 01 марта 2012

У меня есть служба RESTful, которая внедряет EJB (3.0) с помощью аннотации @EJB. Эта инъекция не работает, поскольку я получаю исключение NullPointerException при попытке доступа к методу приветствия () в компоненте.

Этот точный код работает на Glassfish 3.1, а теперь на WAS8.0.2 происходит сбой. Однако внедрение выполняется в том же приложении при обращении к сервлету с использованием точно такого же подхода

@Stateless
@Path("/hello")
public class HelloRestService {

@EJB
public HelloInterface helloImpl;

}

Мой Боб выглядит так

package impl;

@Stateless
@Local
public class HelloImpl implements iface.HelloInterface {

@Override
public String greeting() {

    return "Hello developer";
}

}

Я попытался выполнить поиск по реализации, используя имя jndi, которое выводится на печать при запуске сервера

helloimpl = (HelloImpl) new InitialContext().lookup("java:global/REST_EAR/REST_WAR/HelloImpl!iface.HelloInterface");

это, однако, вызывает ClassCastException

java.lang.ClassCastException: iface.EJSLocal0SLHelloImpl_f8ca883b incompatible with impl.HelloImpl

Могу ли я прочитать много в этом ..?

Сейчас я использую Wink в качестве реализации JAX-RS 1.1. Я ранее использовал Джерси с такими же результатами.

Кто-нибудь знает, если это проблема JAX-RS / WAS, приводящая к сбою DI ..? Это определенно связано с REST, как уже говорилось ранее, инъекция @EJB работает с сервлетом

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Относительно проблемы приведения: вы должны приводить к iface.HelloInterface, а не к HelloImpl, так как ваш бин обернут прокси.

Я не знаю, почему @EJB не работает, но я почти уверен, что Wink не имеет ничего общего с аннотациями EJB ...

0 голосов
/ 17 декабря 2012

У меня были похожие проблемы с внедрением EJB (NPExc.) В приложение. развернут на WAS 8 (z / OS). Я не использовал представление интерфейса (локальный EJB в том же EAR). На локальном WAS8 все работало нормально. Решением было просто удалить EJBclient.jar из пути к классу WEB-модуля (в файле манифеста).

0 голосов
/ 15 марта 2012

Мне удалось решить данную проблему, но я не смог использовать любую другую реализацию JAX-RS, отличную от стандартной по умолчанию в WAS 8. Мне пришлось расширять javax.ws.rs.core.Application из каждого ресурса RESTful и вмой web.xml Я зарегистрировал свой сервлет как

<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

. Мне также нужно было иметь ibm-web-bnd.xml и ibm-web.ext.xml в папке WEB-INF в веб-проекте.,У меня там тоже есть пустой файл beans.xml, это требуется для CDI, но я не могу вспомнить, было ли это важно.

Надеюсь, это поможет людям разобраться в этой проблеме, поскольку я видел много онлайн, которые не могутрешить это.

...