2017-02-21 36 views
0

Мы получили Java EE 7 проекта со следующей структурой:Пропустите фасоль в банку в Lib папки

app.ear 
    META-INF 
    application.xml 
    lib 
    framework.jar 
    webapp.war 
    core.jar 

Framework.jar является нашей основой, которая использует какое-то команда.

Вот как это работает. Каждая команда имеет свой собственный ejb, прикрепленный к ней, который выполняет всю бизнес-логику. Эта команда ejb расширяет класс CommandEJB, который имеет метод выполнения.

Например, это пример командной EJB:

public class cmdCreateBookEJB<T extends cmdCreateBook> extends CommandEJB<T> { 
@Override 
public void execute() { 
    //do something 
} 
} 

И в нашей инфраструктуре, мы также CommandExecutorEJB, который устанавливает соответствующий EJB для команды и выполнить его.

Пример:

CmdCreateBook cmdCreateBook = new cmdCreateBook(); 
cmdCreateBook.setEjb(cmdCreateBookEJB.class.getSimpleName()); 
commandExecutorEJB.execute(cmdCreateBook); 

Проблема наша структура, в частности, CommandExecutorEJB (который упакован в framework.jar внутри Lib папки) нужно знать о EJB от core.jar, поэтому он может работать с командой. Что в действительности происходит в рамках, так это то, что конкретная команда ejb (cmdCreateBookEJB) в моем примере отбрасывается в CommandEJB, а затем вызывается метод execute.

Вопрос в том, как сделать фреймворк о команде ejbs.

Я знаю, что один из вариантов - указать env-entry в ejb-jar.xml с именем модуля ядра jar, а затем использовать @Resource в командеExecutorEJB, чтобы найти запись, а затем использовать поиск JNDI для поиска ресурс, который будет передан в CommandBean.

Но, я бы не хотел использовать ejb-jar.xml, поскольку мы используем ejb 3.2 и ejb-jar.xml больше не нужно.

EDIT: Чтобы лучше объяснить, вот как строка JNDI поиска будет выглядеть на моем примере: java:app/core.jar/cmdCreateBookEJB

Поскольку структура не является и не должен знать о core.jar (Имя Имя core.jar - всего лишь пример, кто-то мог бы назвать его BookStoreCore.jar), мне как-то нужно передать имя модуля (в моем примере core.jar), чтобы структура знала, где искать классы, чтобы найти определенную команду EJB , в моем примере cmdCreateBookEJB.

Я знаю, что я могу использовать env-var в ejb-jar.xml, чтобы передать имя модуля в фреймворк. Вот пример:

<session> 
      <ejb-name>CommandExecutorEJB</ejb-name> 
      <ejb-class>com.mypackage.CommandExecutorEJB</ejb-class> 
      <session-type>Stateless</session-type> 
      <env-entry> 
       <env-entry-name>com.mypackage.CommandExecutorEJB/moduleName</env-entry-name> 
       <env-entry-type>java.lang.String</env-entry-type> 
       <env-entry-value>core</env-entry-value> 
      </env-entry> 
     </session> 

Но я хотел бы, чтобы устранить EJB-jar.xml от нашей установки проекта

ответ

0

Вы используете Java EE 7.

Вы можете полностью избежать проблем видимости класса помещая все в ваш файл WAR. core.jar и framework.jar могут быть добавлены в ваш каталог WEB-INF/lib.

Затем вы можете напрямую вводить EJB, где бы они ни были необходимы.

+0

Я не уверен, что вы правильно поняли мою проблему. Может быть, я не объяснил это лучше всего. Моя проблема в том, что framework.jar необходимо знать о EJB, которые еще не созданы.В моем примере фреймворк не знает, что будет создан cmdCreateBookEJB, но он нуждается в нем для выполнения команды. Я знаю, что могу передать имя модуля моего ядра в env-varuable, используя ejb-jar.xml, а затем найти ресурс jndi. Например, путь будет java: app/core.jar/cmdCreateBookEJB, но я хочу, чтобы этого избежать и каким-то образом динамически вставлять в фреймворк, или, по крайней мере, не указывать имя модуля – user3362334

+0

У вас есть еще более основная проблема в том, что классы EJB в «core.jar» не видны «framework.jar» (если все они не указаны через интерфейсы, объявленные в рамках). Вам нужно показать больше кода, потому что я подозреваю, что вам нужно также использовать CDI. –