Могут ли EJB2 и EJB3 сосуществовать в одном приложении? - PullRequest
8 голосов
/ 19 мая 2011

Кто-нибудь знает, возможно ли итеративно заменять EJB2.1-компоненты EJB3-компонентами в приложении Java EE?

То есть: за один раз удалите один компонент 2.1 из кода и добавьте соответствующий компонент EJB3, который реализует то же поведение, не затрагивая остальную часть кода (+ возможность внедрять устаревшие EJB-компоненты с помощью аннотаций в новомEJB3).

Я не являюсь экспертом в спецификациях EJB (и у меня есть опыт работы только с EJB3), но для меня EJB - это просто компонент с заданным бизнес-интерфейсом, который управляется сервером приложений.AFAIK EJB3 принес большое упрощение, как написать компонент (без искусственных интерфейсов), и большую часть времени xml дескриптор может быть опущен благодаря аннотациям, но основы те же.Так что это кажется правдоподобным, это может сработать.

Есть ли какая-либо несовместимость между EJB2.1 и EJB3?

Суть вопроса в том, нужна ли миграция EJB2.1 -> EJB3быть операцией stop-the-world / complete-rewrite или это можно сделать при добавлении новой функции и исправлении ошибок в унаследованном приложении (поэтому в запущенном приложении какое-то время будет смесь EJB2.1 и EJB3).

EDIT:

  • Меня интересуют только сессионные компоненты.
  • Мне любопытно, будет ли (и как) поиск работать.Для AFAIK EJB2.1 требуется нечто, называемое домашним интерфейсом, чтобы получить ссылку на другой EJB, но EJB3 не имеет домашнего интерфейса ...

Ответы [ 3 ]

13 голосов
/ 22 августа 2014

Сосуществует с EJB 2.1 и EJB 3-бобами

EJB2 и EJB3 бины могут сосуществовать в одном корпоративном приложении (.ear), но не могут находиться в одном и том же файле ejb jar (модуле). Следовательно, компоненты EJB3 должны находиться в другой банке, чем компоненты EJB2.

Вызов EJB 3 из EJB 2.1

EJB3 bean не имеет домашнего интерфейса, в то время как EJB 2.1 требует этого. Чтобы компонент EJB3 мог получать доступ из EJB2, вам необходимо добавить локальный домашний интерфейс (или удаленный дом, если требуется удаленный вызов) к компоненту EJB3.

Создать домашний интерфейс:

public interface SystemTimeLocalHome extends EJBLocalHome {  
  SystemTimeLocal create() throws CreateException;  
}  

Добавить домашний интерфейс к EJB3 bean:

@Stateless  
@Local(TimeServiceLocal.class)  
@LocalHome(TimeServiceLocalHome.class)  
public class TimeServiceBean implements TimeServiceLocal {  
   public long getCurrentTimeMillis() {  
      return System.currentTimeMillis();  
   }  
}  

Внутри бина EJB2 код для вызова бина EJB3 просто следует спецификации EJB2: ищет ссылку, вызывает домашний интерфейс для создания локального интерфейса, а затем вызывает метод на локальном интерфейсе.

Context ctx = new InitialContext();  
TimeServiceLocalHome home = (TimeServiceLocalHome)ctx.lookup("java:comp/env/" + ejbRefName);  
TimeServiceLocal timeService = home.create();  
timeService.getCurrentTimeMillis();  

Вызов EJB 2.1 из EJB 3

Внедрение зависимостей используется для внедрения ссылок на компоненты EJB 2.1 в компонент EJB3. Отличие от внедрения EJB3-компонента заключается в том, что это домашний интерфейс EJB2-объекта. Вызовите метод create() на введенном домашнем интерфейсе EJB, чтобы создать экземпляр класса EJB.

@EJB BankingServiceHome bsHome;

BankingService bs = bsHome.create();
bs.getBalance(...);
3 голосов
/ 19 мая 2011

Миграция возможна, хотя не без икоты.

Начните с обновления дескриптора до схем Java EE 5. Обычно это флаг, который серверы используют для определения необходимости сканирования аннотаций.

Как только вы обновите дескриптор (но в остальном не изменится), вы можете начать миграцию ваших сессионных и управляемых сообщениями bean-компонентов в bean-компоненты Java EE 5. При преобразовании bean-компонента вы также можете удалить его из дескриптора развертывания.

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

0 голосов
/ 19 мая 2011

Конечно, вы можете. Посмотрите здесь для начала: http://www.coderanch.com/t/321218/EJB-JEE/java/EJB-call-EJB

...