Доступ к вставленному сессионному компоненту с сохранением состояния через просматриваемый сессионный компонент

Мне было интересно, позволяют ли спецификации 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 ответа

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

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

Спецификация 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 была выбрана опция установки метаданных. Эта опция изменит параметр завершения метаданных на "true". Прекратите использовать эту опцию или добавьте <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 classpath приложения, затем загрузчик классов приложения будет загружать другой экземпляр, и он не будет совпадать с экземпляром, используемым контейнером EJB. В журналах должно быть предупреждение, если это произошло.

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

Другие вопросы по тегам