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