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