JEE7中如何在JNDI树中指定EJB bean名称
How to specify the EJB bean name in the JNDI tree in JEE7
我不确定这是一个通用的 JEE6 问题还是一个 Wildfly 10/JBoss7 EAP 实现特定的问题。
我正在尝试 specify/override 我的 EJB JNDI 映射中使用的默认 beanName 映射到对我来说更有意义的东西。
例如:
登录管理器Bean:
@Stateless
public class LoginManagerBean extends BaseManagerBean implements LoginManager {
....
}
登录管理器:
@Local
public interface LoginManager{
....
}
在此上下文中,WF10 将自动为此 EJB 创建一个 JNDI 映射为:
ejb:myApp/myJar/LoginManagerBean!LoginManager
在 EJB naming conventions 的 Wildfly 10 文档中说
对于无状态 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。
您似乎只在使用本地接口,因此 none 您链接的说明适用,因为它们仅适用于 远程 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.Whosebug.p43282192.LoginManager
java:app/serverapp/LoginManagerBean!com.Whosebug.p43282192.LoginManager
java:module/LoginManagerBean!com.Whosebug.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.Whosebug.p43282192.LoginManager
java:app/serverapp/Foo!com.Whosebug.p43282192.LoginManager
java:module/Foo!com.Whosebug.p43282192.LoginManager
java:global/serverapp/Foo
java:app/serverapp/Foo
java:module/Foo
如果需要,您可以查看这些内容:
LoginManager loginManager = (LoginManager)(new InitialContext().lookup("java:app/serverapp/Foo"));
或使用注入:
@EJB(beanName="Foo")
private LoginManager loginManager;
顺便说一句,我只是在这里部署示例 EJB jar (serverapp.jar)。如果您使用的是 EAR 文件,则某些名称具有附加路径元素。
我不确定这是一个通用的 JEE6 问题还是一个 Wildfly 10/JBoss7 EAP 实现特定的问题。
我正在尝试 specify/override 我的 EJB JNDI 映射中使用的默认 beanName 映射到对我来说更有意义的东西。
例如:
登录管理器Bean:
@Stateless
public class LoginManagerBean extends BaseManagerBean implements LoginManager {
....
}
登录管理器:
@Local
public interface LoginManager{
....
}
在此上下文中,WF10 将自动为此 EJB 创建一个 JNDI 映射为:
ejb:myApp/myJar/LoginManagerBean!LoginManager
在 EJB naming conventions 的 Wildfly 10 文档中说 对于无状态 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。
您似乎只在使用本地接口,因此 none 您链接的说明适用,因为它们仅适用于 远程 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.Whosebug.p43282192.LoginManager
java:app/serverapp/LoginManagerBean!com.Whosebug.p43282192.LoginManager
java:module/LoginManagerBean!com.Whosebug.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.Whosebug.p43282192.LoginManager
java:app/serverapp/Foo!com.Whosebug.p43282192.LoginManager
java:module/Foo!com.Whosebug.p43282192.LoginManager
java:global/serverapp/Foo
java:app/serverapp/Foo
java:module/Foo
如果需要,您可以查看这些内容:
LoginManager loginManager = (LoginManager)(new InitialContext().lookup("java:app/serverapp/Foo"));
或使用注入:
@EJB(beanName="Foo")
private LoginManager loginManager;
顺便说一句,我只是在这里部署示例 EJB jar (serverapp.jar)。如果您使用的是 EAR 文件,则某些名称具有附加路径元素。