首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在JEE7中的JNDI树中指定EJB名称

如何在JEE7中的JNDI树中指定EJB名称
EN

Stack Overflow用户
提问于 2017-04-07 15:43:15
回答 1查看 8.5K关注 0票数 3

我不确定这是一个通用的JEE6问题,还是一个Wildfly 10/JBoss7EAP实现的特定问题。

我试图指定/重写EJB映射中使用的默认beanName,使之对我更有意义。

例如:

LoginManagerBean:

代码语言:javascript
运行
复制
@Stateless
public class LoginManagerBean extends BaseManagerBean implements LoginManager {
....
}

LoginManager:

代码语言:javascript
运行
复制
@Local
public interface LoginManager{
....
}

在此上下文中,WF10将自动为该EJB创建JNDI映射,如下所示:

代码语言:javascript
运行
复制
ejb:myApp/myJar/LoginManagerBean!LoginManager

在用于EJB命名约定的Wildfly 10文档中,它提到了无状态bean:

ejb:/! ………… bean-name :这是您正在查找的bean的名称。bean名称通常是bean实现类的不限定类名,但可以通过ejb-jar.xml或通过注释覆盖。bean名称部分不能是JNDI名称中的空字符串。

但是,我似乎找不到在注释中使用哪个注释来指定bean名称。如果我读取@EJB的文档,它会声明beanName参数是:

此引用映射到的企业Java Bean的ejb名称

因此,从文档来看,beanName似乎不是正确使用的参数。

那么,如何在映射中将EJB重命名为我所选择的东西呢?例如,我可以使用什么注释来读取映射:

代码语言:javascript
运行
复制
ejb:myApp/myJar/MyReallyCoolName!LoginManager
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-08 01:19:07

如果您使用的是JBossEAP 7/WildFly10.x,那么这就是JavaEE 7,尽管JavaEE 6也有相同的答案。

您似乎只使用本地接口,所以您所链接的指令都不适用,因为它们只适用于远程EJB客户端。因此,这些声明:

在此上下文中,WF10将自动为该EJB创建JNDI映射,如下所示: ejb:myApp/myJar/LoginManagerBean!LoginManager

是完全不正确的。

部署应用程序时,所有JNDI名称都记录在服务器控制台中:

代码语言:javascript
运行
复制
java:global/serverapp/LoginManagerBean!com.stackoverflow.p43282192.LoginManager
java:app/serverapp/LoginManagerBean!com.stackoverflow.p43282192.LoginManager
java:module/LoginManagerBean!com.stackoverflow.p43282192.LoginManager
java:global/serverapp/LoginManagerBean
java:app/serverapp/LoginManagerBean
java:module/LoginManagerBean

大多数情况下,您不应该关心JNDI名称,因为通常每个EJB都是唯一的,服务器将找到正确的实现:

代码语言:javascript
运行
复制
public class LoginClient {

    @EJB
    private LoginManager loginManager;

    ...

}

如果您想使用JNDI查找,并且希望为自己创建更多的工作,那么可以指定bean名称:

代码语言:javascript
运行
复制
@Stateless(name="Foo")
public class LoginManagerBean implements LoginManager {

   ...

产生的结果:

代码语言:javascript
运行
复制
java:global/serverapp/Foo!com.stackoverflow.p43282192.LoginManager
java:app/serverapp/Foo!com.stackoverflow.p43282192.LoginManager
java:module/Foo!com.stackoverflow.p43282192.LoginManager
java:global/serverapp/Foo
java:app/serverapp/Foo
java:module/Foo

如果你必须的话,你可以查一下这些:

代码语言:javascript
运行
复制
LoginManager loginManager = (LoginManager)(new InitialContext().lookup("java:app/serverapp/Foo"));

或使用注射:

代码语言:javascript
运行
复制
     @EJB(beanName="Foo")
     private LoginManager loginManager;

顺便说一下,我只是在这里部署示例EJB (serverapp.jar)。如果使用EAR文件,其中一些名称有一个额外的path元素。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43282192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档