当前位置: 首页 > 知识库问答 >
问题:

在多模块项目中通过本地接口查找EJB

丁雅逸
2023-03-14

我试图通过ServiceLocator进行EJB查找,而不硬编码JNDI名称,只使用本地接口名称。问题是EJB分布在其他模块(JAR)中。根据示例,我有以下场景:

项目-xxx:

@Stateless
class EjbXBean implements EjbX {

}

由容器向JNDI注册:java:global/project xxx/EjbXBean

项目yyy:

@Stateless
class EjbYBean implements EjbY {

}

由容器向JNDI注册:java:global/project yyy/EjbYBean

EjbX和EjbY都是本地的。我希望EJB只在另一个模块中执行此操作:

EjbX ejbx = ServiceLocator.lookup(EjbX.class);
EjbY ejby = ServiceLocator.lookup(EjbY.class);

但我不知道什么是仅在ServiceLocator内具有本地接口的模块(项目yyy或项目xxx)。我不能仅使用整个JNDI名称和模块名称进行查找:

EjbX ejbx = ServiceLocator.lookup("java:global/project-yyy/EjbXBean");
EjbY ejby = ServiceLocator.lookup("java:global/project-yyy/EjbYBean");

我试图弄清楚这种情况下的最佳实践是什么,因为我不知道硬编码的JNDI名称在JavaEE世界中是否是一个好的实践。

我使用OpenEjb 4.7.4进行开发和集成测试,使用Wildfly 10.1.0进行生产。

我可以在Wildfly 10.1.0中使用CDI:

@Override
public Object lookup(Class<?> type, Annotation... annotations) throws NamingException {
    BeanManager manager = CDI.current().getBeanManager();
    Iterator<Bean<?>> beans = manager.getBeans(type, annotations).iterator();

    if (!beans.hasNext()) {
        throw new NamingException("CDI BeanManager cannot find an instance of requested type " + type.getName());
    }
    Bean<?> bean = beans.next();
    CreationalContext<?> ctx = manager.createCreationalContext(bean);
    return manager.getReference(bean, type, ctx);
}

并打电话:

MyClass.lookup(EjbX.class);

但我不想使用CDI,因为我在将其放入可嵌入容器(OpenEJB)中时遇到了一些问题。


共有1个答案

夏侯智鑫
2023-03-14

为什么需要不同的模块?在一场战争中,你只需注入bean即可。(在每一场包含托管bean的战争中,您只需要一个bean.xml)

我不确定命名的标准化是否适用于openejb和wildfly。由于两者都是ejb 3.1,所以应该检查您的名称是否符合标准?。我过去在使用队列和主题时遇到过问题。也许jboss命名ejb3.1会有所帮助。

为了确保名称可用,也许您应该考虑使用arquillian进行测试。但是我完全可以解决本地bean的命名服务问题。

此外,我不会使用openejb进行测试。我知道它是可嵌入的,但差异很大。另一个CDI-Container,可能是eclipselink而不是hibernate。两者都有很大的不同。我不会在这些上进行测试并在野蝇中部署

如果您想要基于Weld并使用hibernate的可嵌入的东西,可以考虑cdi单元或ejb cdi单元(好的,这是我的项目,所以我不是完全公正的;-)

 类似资料:
  • 我正在使用spring boot,我决定只是为了把我的项目分成模块。我有4个模块,网络,服务,存储库,领域。除了JSP外,其他工作都很好,spring找不到这些页面。但当我没有把我的项目分成模块时,它就起作用了。我没有改变配置。 这是我的web模块结构 Runner位于web模块中,如下所示: 此外,Intellij想法还告诉我,index.jsp没有视图解析器,尽管我显式地添加了视图解析器bea

  • 我似乎无法让Maven在多模块项目中找到兄弟姐妹的模块。 我已经在所有模块中运行了。 下面是MagnicCompCommon 下面是Model

  • 问题内容: 我们目前正在编写一个应用程序,该应用程序分为多个项目/模块。例如,让我们采用以下模块: myApp-DAO myApp-jabber 每个模块都有其自己的Spring上下文xml文件。对于DAO模块,我有一个PropertyPlaceholderConfigurer,它读取带有必需的数据库连接参数的属性文件。在jabber模块中,我还有一个用于jabber连接属性的PropertyPl

  • 是否可以使用本地接口从war访问驻留在ear文件中的ejb 都部署在同一个应用服务器下。 ejb: 现在,在测试servlet(战争)中: 失败于: javax。命名。NameNotFoundException:试图在/app/webapp/FirstWebEJBTest/12292093中查找comp/env/FirstDemoEJB/Local时。; 但是远程查找可以很好地工作:

  • 问题内容: 我有学习的背景和思想。 我喜欢使用的其中一项功能是可以将项目制作为多Maven模块。例? 令人高兴的是,每个模块都可以具有自己的依赖性,并且可以独立测试它们,而不用运行一个整体应用程序。 我们如何实现类似的东西,或者它的生态系统? 问题答案: 你绝对可以做到的。这被称为SBT Multi-Project build。您可以使用以下内容定义一个主项目和多个子项目(来自上面的docs链接)

  • 我曾广泛使用过Maven 目前有5个不同的maven项目,每个项目都有一个不同的pom.xml。到目前为止,它们之间存在依赖关系,如果需要,每一个都指向 中的另一个。 现在我们不喜欢的是 当我们发布子projectA时,我们需要手动修改所有将projectA作为依赖项的项目以使用新版本。Saw Maven有一个版本插件,不知道这会有什么帮助。 作为解决方案,我希望在POM之间有一个更干净的组织,并