gpt4 book ai didi

java - JEE7中如何在JNDI树中指定EJB bean名称

转载 作者:行者123 更新时间:2023-11-29 08:37:04 25 4
gpt4 key购买 nike

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

我正在尝试将我的 EJB JNDI 映射中使用的默认 beanName 指定/覆盖为对我更有意义的东西。

例如:

登录管理器Bean:

@Stateless
public class LoginManagerBean extends BaseManagerBean implements LoginManager {
....
}

登录管理器:

@Local
public interface LoginManager{
....
}

在此上下文中,WF10 将自动为此 EJB 创建一个 JNDI 映射:

ejb:myApp/myJar/LoginManagerBean!LoginManager

在 Wildfly 10 文档中 EJB naming conventions , 它说对于无状态 bean:

ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>

.... ....

bean-name : This is the name of the bean for which you are doing the lookup. The bean name is typically the unqualified classname of the bean implementation class, but can be overriden through either ejb-jar.xml or via annotations. The bean name part cannot be an empty string in the JNDI name.

但是,我似乎无法找到使用哪个注解来指定注解中的 bean 名称。如果我阅读 @EJB 的文档它指出 beanName 参数是:

The ejb-name of the Enterprise Java Bean to which this reference is mapped

所以从文档来看,beanName 似乎不是要使用的正确参数。

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

ejb:myApp/myJar/MyReallyCoolName!LoginManager

最佳答案

如果您使用的是 JBossEAP 7/WildFly 10.x,那么这就是 JavaEE 7,尽管同样的答案也适用于 Java EE 6。

您似乎只在使用本地接口(interface),因此您链接的说明均不适用,因为它们仅适用于远程 EJB 客户端。因此这些声明:

In this context, WF10 will automatically create a JNDI mapping for this EJB as:

ejb:myApp/myJar/LoginManagerBean!LoginManager

完全不正确。

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

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 都是唯一的并且服务器会找到正确的实现:

public class LoginClient {

@EJB
private LoginManager loginManager;

...

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

@Stateless(name="Foo")
public class LoginManagerBean implements LoginManager {

...

产生:

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

如果需要,您可以查看这些内容:

LoginManager loginManager = (LoginManager)(new InitialContext().lookup("java:app/serverapp/Foo"));

或使用注入(inject):

     @EJB(beanName="Foo")
private LoginManager loginManager;

顺便说一句,我只是在这里部署示例 EJB jar (serverapp.jar)。如果您使用的是 EAR 文件,则某些名称具有附加路径元素。

关于java - JEE7中如何在JNDI树中指定EJB bean名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43282192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com