Можно ли использовать аннотацию ejb и CDI в устаревшем проекте, где все существующие EJB настроены в ejb-jar.xml

Существует унаследованная кодовая база с самым старым EJB, где все существующие EJBS настроены в ejb-jar.xml

<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1">
    <session>
        <ejb-name>ABean</ejb-name>
        <home>com.bla.api.RemoteBeanHome</home>
        <remote>com.bla.api.RemoteBean</remote>
        <ejb-class>com.bla.api.ABean</ejb-class>
        <session-type>Stateless</session-type>
        <transaction-type>Container</transaction-type>
    </session>
....

Это работает посредством поиска через JNDI. Однако сервер был обновлен до Weblogic 12.2, где поддерживается Java EE 7. Поэтому при внедрении нового локального EJB в удаленный компонент сеанса ABean я думаю использовать просто аннотацию @EJB, не затрагивая существующий дескриптор развертывания XML.

Однако возникает следующая ошибка:

The ejb-ref does not have an ejb-link and the JNDI name of the target bean has
not been specified. Attempts to automatically link the ejb-ref to its target 
bean failed because no EJBs in the application were found to implement the
"com.bla.api.NewBean" interface. Link or map this ejb-ref to its target EJB 
and ensure the interfaces declared in the ejb-ref are correct.

Новый локальный код ejb без сохранения состояния выглядит следующим образом:

@Stateless
public class TestEJB {
    public void test() {
        System.out.println("I am the first EJB injected with CDI");
    }
}

Вопрос: В таком случае можно ли добавлять новые EJB с аннотацией вместо ejb-jar.xml?


person Rui    schedule 07.05.2020    source источник


Ответы (1)


Я боюсь, что этот маленький тег в вашем дескрипторе развертывания version="2.1" сообщает серверу приложений, что ваше приложение является приложением Java EE 2.1, и он будет обрабатывать его соответствующим образом. Все новые функции спецификации будут недоступны. Также я боюсь, что шаг от Java-EE 2 к 5 был настолько большим, что вы не сможете сделать свое приложение приложением JavaEE 5+ без изменений кода. Я имею в виду, что весь шаблонный код, который был удален в Java EE 5 (интерфейсы Home, Remote и т. д.), по-видимому, все еще находится внутри вашего проекта. Но могу ошибаться, я не такой уж и старый, начал работать с JEE в версии 5.

person Community    schedule 08.05.2020
comment
Большое спасибо за ваш ответ. Я имею большой смысл. Что, если я обновлю все теги ejb-jar во всех тегах ejb-jar.xml по всему многомодульному проекту? Java считается обратно совместимым - person Rui; 08.05.2020
comment
Ну, Java как язык обратно совместим. Java EE — это спецификация, определяющая контракт между сервером приложений Java EE и приложением Java EE. Начиная с Java EE 5 и до Jakarta 8, вы действительно могли просто обновить тег версии, и ваше приложение будет работать с новой спецификацией. Я так понимаю, что JEE2 -> Java EE 5 был переломным моментом. Спецификация Java EE 5 устранила много стандартного кода, например, домашних интерфейсов. Поэтому, чтобы двигаться дальше, вам также придется изменить свой код. В зависимости от сложности вашего приложения это может быть или не быть возможным... - person ; 08.05.2020