Доступ к вставленному сессионному компоненту с сохранением состояния через просматриваемый сессионный компонент с сохранением состояния - PullRequest
0 голосов
/ 20 ноября 2018

Мне было интересно, разрешают ли спецификации EJB получить доступ к сессионному компоненту с отслеживанием состояния через просмотренный сессионный компонент с сохранением состояния.

Причина, по которой я спрашиваю, заключается в том, что у Jboss EAP 7.0 с этим нет проблем, но Websphere выдает исключение NullPointerException при попытке получить доступ к бину.

Например:

@Stateful
public class SampleServiceRoot implements SampleServiceRootRemote {

    @EJB
    protected SampleServiceChildLocal servicechild;

    @Override
    public SampleServiceChildLocal getServiceChild(){
        return servicechild;
    }
}

@Stateful
public class SampleServiceChild implements SampleServiceChildLocal,SampleServiceChildRemote{

    @Override       
    public void anyMethod(){
      //DO Anything
    }
}

Когда я выполняю удаленный поиск в SampleServiceRootRemote и вызываю «getServiceChild ()» и пытаюсь вызвать для него «anyMethod ()», он работает на JBoss EAP 7.0, но в Websphere я получаю исключение NullPointerException.

Так что мне было интересно, если это ошибка в Websphere или она запрещена спецификацией EJB, и мне просто повезло с JBoss EAP 7.0?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Спасибо за ответ,

мы попытались переместить объявления локального интерфейса в удаленный интерфейс SampleServiceChild.Также мы не использовали аннотацию @EJB.Нам удалось это сделать, выполнив поиск SampleServiceChild по InitialContext.Теперь это работает

0 голосов
/ 20 ноября 2018

Спецификация EJB требует, чтобы этот сценарий работал, в зависимости от некоторых параметров конфигурации;Существуют опции конфигурации, которые могут его отключить.

Тот факт, что вы видите исключение NullPointerException, указывает на то, что WebSphere не знает о аннотации @EJB для поля в классе SampleServiceRoot.Согласно спецификации EJB, экземпляр SampleServiceRoot не может быть создан, если аннотация @EJB не может быть разрешена.Поскольку был создан экземпляр SampleServiceRoot, вероятно, произошло одно из следующих действий:

1 - приложение выполнило new SampleServiceRoot вместо того, чтобы искать его в JNDI.Это не похоже на вашу проблему, но хорошо перепроверить.

2 - Приложение содержит ejb-jar.xml с настройкой metadata-complete="true".Когда это установлено, WebSphere не будет искать аннотации и поэтому не будет видеть или обрабатывать аннотацию @EJB.Либо измените параметр на «ложь», либо добавьте <ejb-ref> или <ejb-local-ref> в файл ejb-jar.xml.

3 - Однако приложение не имеет metadata-complete="true", когда приложение развертывается в WebSphere.была выбрана опция для установки метаданных.Эта опция изменит параметр завершения метаданных на «истина».Прекратите использовать эту опцию или добавьте <ejb-ref> или <ejb-local-ref> в файл ejb-jar.xml.

4 - EJB содержится в модуле WAR уровня 2.4 или более ранней.В WebSphere аннотации для более старых модулей не обрабатываются.

5 - Приложение включает в себя копию класса javax.ejb.EJB.WebSphere предоставляет класс javax.ejb.EJB и загружается загрузчиком классов среды выполнения WebSphere.Если приложение также содержит класс javax.ejb.EJB в пути к классам приложения, то загрузчик классов приложения загрузит другой экземпляр, и он не будет соответствовать экземпляру, используемому контейнером EJB.Если это произошло, в журналах должно быть предупреждение.

Так что да, ваш сценарий должен поддерживаться;однако спецификация допускает конфигурации, которые ее отключают.Вам просто нужно определить, какая опция конфигурации / упаковки привела к тому, что WebSphere не видит аннотацию @EJB.

...