2012-02-29 9 views
1

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

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

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

@EJB 
public HelloInterface helloImpl; 

} 

Мои Bean выглядит как этот

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 работает с сервлета

ответ

0

мне удалось решить этот вопрос в вопросе, но не смог использовать любую другую реализацию 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, но я не могу вспомнить, было ли это необходимо.

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

+0

Я думаю, что вам не хватает имя класса сервлета –

+0

Имя класса Sevlet больше не требуется в версии web.xml версии 3 , – Pool

1

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

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

+0

Вы правы, он работает, когда я передаю интерфейс. Это пошлое обходное решение, но начало, пока мы не сможем понять, почему DI-инъекция не работает на WAS 8 –

0

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