2017-02-21 23 views
0

我们得到的Java EE 7项目结构如下:传递豆的罐子在lib文件夹

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)需要了解EJB的从core.jar添加,所以它可以处理的命令。框架中实际发生的事情是,我的示例中的特定命令ejb(cmdCreateBookEJB)被转换为CommandEJB,然后调用它的execute方法。

的问题是如何使框架知道命令的EJB。

我知道,一个选项是指定在ejb-jar.xml与核心罐子模块名称上午ENV入境,然后用@Resource在commandExecutorEJB找到入口,然后使用JNDI查找找到将被转换为CommandBean的资源。

但是,我想不是我们使用EJB 3.2和EJB-jar.xml中使用ejb-jar.xml中不再是必需的。

编辑: 为了更好地解释这里是JNDI查找字符串是如何看起来像我的例子:java:app/core.jar/cmdCreateBookEJB

因为框架不是也不应该意识到core.jar添加的(名字core.jar name只是一个例子,有人可以将它命名为BookStoreCore.jar),我需要传递模块名称(在我的示例中为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> 

不过,我很想

回答

0

您使用的Java EE 7

可以完全避免类可视性问题从我们的项目设置消除ejb-jar.xml中将所有内容放入WAR文件中。 core.jarframework.jar都可以添加到您的WEB-INF/lib目录中。

您可以然后直接注射在需要他们在以往任何时候的EJB。

+0

我不知道你理解错了我的问题。也许我没有最好的解释。我的问题是,framework.jar需要知道尚未创建的EJB。在我的例子框架不知道cmdCreateBookEJB将被创建,但它需要它来执行该命令。我知道我可以使用ejb-jar.xml将我的核心模块名称传递给env-varuable,然后通过jndi查找资源。例如,路径为java:app/core.jar/cmdCreateBookEJB,但我想避免这种情况并以某种方式动态注入框架,或者至少不指定模块名称 – user3362334

+0

您有一个更基本的问题,即EJB类'core.jar'对'framework.jar'不可见(除非它们全部通过框架中声明的接口来引用)。你需要展示更多的代码,因为我怀疑你也需要开发CDI。 –

相关问题