我们获得了具有以下结构的Java EE 7项目:
app.ear
META-INF
application.xml
lib
framework.jar
webapp.war
core.jar
Framework.jar是我们使用某种命令模式的框架。
这是它的工作原理。每个命令都附加了它自己的ejb,它可以完成所有业务逻辑。此命令ejb扩展了具有execute方法的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(在lib文件夹中的framework.jar中打包)需要知道core.jar中的ejb,所以它可以处理命令。框架中实际发生的是我的示例中的特定命令ejb(cmdCreateBookEJB)被强制转换为CommandEJB,然后调用它的execute方法。
问题是如何使框架了解命令ejbs。
我知道一个选项是在ejb-jar.xml中使用核心jar模块名称指定am env-entry,然后在commandExecutorEJB中使用@Resource来查找条目,然后使用JNDI查找来查找资源将被强制转换为CommandBean。
但是,我不想使用ejb-jar.xml,因为我们正在使用ejb 3.2并且不再需要ejb-jar.xml。
修改
为了更好地解释这里的jndi查找字符串在我的示例中的样子:java:app/core.jar/cmdCreateBookEJB
因为框架不是并且不应该知道core.jar(名称core.jar名称只是一个例子,有人可以将其命名为BookStoreCore.jar),我不知何故需要传递模块name(在我的示例中为core.jar),以便框架知道在哪里查找类以查找特定命令EJB,在我的示例cmdCreateBookEJB中。
我知道我可以在ejb-jar.xml中使用env-var将模块名称传递给框架。这是一个例子:
<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 :(得分:0)
您正在使用Java EE 7.
通过将所有内容放在WAR文件中,可以完全避免类可见性问题。 core.jar
和framework.jar
都可以添加到WEB-INF / lib目录中。
然后,您可以直接在他们需要的地方注入EJB。