Я переношу 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 ничего не хватает?
ответ
Я вернулся из EJB 2.1 в EJB 3.1 пару лет назад, и я вспоминаю те же проблемы и ошибки, с которыми вы сталкиваетесь.
Хотя я не помню точного действия, которое фиксировало проблему, и других проблем, с которыми я столкнулся на этом пути, но я расскажу вам, что я сделал, чтобы исправить ВСЕ проблемы, в том числе и этот.
Примечание: Это непростая задача для переноса, но после следующих последующих шагов, как описано, вы сэкономите много хлопот позже.
- Annotate сессионные компоненты и интерфейсы с соответствующими аннотациями: В моем случае я имел удаленные интерфейсы для EJB 2.1 бобов. Поскольку мне не нужен фактический удаленный интерфейс в моем приложении, я переключил их на локальные интерфейсы.
- Пустой IBM-EJB-банка-bnd.xml и IBM-EJB-банка-ext.xml
- Изменить клиент для поиска, либо используя 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 исключения и бросить свое собственное исключение во время выполнения
Надеется, что вы найдете ее полезной.
В обоих 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 или имя по умолчанию, если оно не указано.