将bean传递给lib文件夹

时间:2017-02-21 16:25:19

标签: java maven java-ee

我们获得了具有以下结构的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

1 个答案:

答案 0 :(得分:0)

您正在使用Java EE 7.

通过将所有内容放在WAR文件中,可以完全避免类可见性问题。 core.jarframework.jar都可以添加到WEB-INF / lib目录中。

然后,您可以直接在他们需要的地方注入EJB。