2017-02-10 6 views
0

Я переношу Ejb 2.1 в Ejb 3.1. Я изменил версию Java с 1.6 до 1.8 и версию Ejb с 2.1 до 3.1. Как только я внес изменения, у меня возникают проблемы с файлами ibm-ejb-jar-bnd.xml и ibm-ejb-jar-ext.xml. Я получаю эти сообщения:EJB 2.1 - EJB 3.1 Миграция - сессия EJB с именем не найдено

1: Session EJB с именем 'abcEJB' не найден
2: Ссылка на ресурс с именем 'ResourceRef_xyz' не найден для этого EJB или перехватчик

Am I ничего не хватает?

enter image description here


enter image description here

ответ

1

Я вернулся из EJB 2.1 в EJB 3.1 пару лет назад, и я вспоминаю те же проблемы и ошибки, с которыми вы сталкиваетесь.

Хотя я не помню точного действия, которое фиксировало проблему, и других проблем, с которыми я столкнулся на этом пути, но я расскажу вам, что я сделал, чтобы исправить ВСЕ проблемы, в том числе и этот.

Примечание: Это непростая задача для переноса, но после следующих последующих шагов, как описано, вы сэкономите много хлопот позже.

  1. Annotate сессионные компоненты и интерфейсы с соответствующими аннотациями: В моем случае я имел удаленные интерфейсы для EJB 2.1 бобов. Поскольку мне не нужен фактический удаленный интерфейс в моем приложении, я переключил их на локальные интерфейсы.
  2. Пустой IBM-EJB-банка-bnd.xml и IBM-EJB-банка-ext.xml enter image description here
  3. Изменить клиент для поиска, либо используя DI, имя JNDI. В моем случае я использовал поиск JNDI.

Теперь код должен выглядеть следующим образом:

Session Bean интерфейс:

@Local 
public interface MySessionInterface { 
    // TODO :: declare business methods 
} 

компонент реализации Session:

@stateless 
public interface MySessionBeanImpl implements MySessionInterface { 
    // TODO :: implement business methods 
} 

Service Locator для поиска EJBs с помощью JNDI:

public class ServiceLocator { 
    public final <T> T getLocalSession(Class<T> _class) throws NamingException { 
     return (T) new InitialContext().lookup("ejblocal:" + _class.getName()); 
    } 
} 

Клиент:

public class SessionClient { 
    public void performOperation() { 
     try { 
      MySessionInterface session = ServiceLocator.getLocalSession(MySessionInterface.class); 
      // TODO :: perform business logic here 
     } catch (NamingException e) { 
      // TODO :: handle exception 
     } 
    } 
} 

Конечно служба поиска может иметь следующие улучшения, но я удалил их для краткости:

  • Cache результат вместо того, чтобы смотреть его каждый раз из JNDI
  • Ловите проверенное NamingException исключения и бросить свое собственное исключение во время выполнения

Надеется, что вы найдете ее полезной.

1

В обоих IBM-EJB-банку-bnd.xml и IBM-EJB-Jar-ext.xml файлов, то <session> элемент должен содержать имя от EJB, к которому он относится. Это имя должно совпадать с именем EJB, определенным в соответствующем файле ejb-jar.xml, а именно с элементом <ejb-name> или именем EJB, идентифицированным либо аннотацией @Stateless, @Stateful, либо @Singleton. При использовании аннотаций имя ссылается либо на атрибут имени аннотации, либо на простое имя класса.

Аналогичным образом элемент <resource-ref> должен содержать имя ссылок на ресурсы, к которым он относится. В ejb-jar.xml это будет элемент <res-ref-name>. Если ссылка ресурса определяется аннотациями, то элемент имени аннотации @Resource или имя по умолчанию, если оно не указано.

Смежные вопросы