我不确定这是一个通用的JEE6问题,还是一个Wildfly 10 / JBoss7 EAP实现特定问题。
我试图将我的EJB JNDI映射中使用的默认beanName指定/覆盖到对我来说更有意义的东西。
例如:
LoginManagerBean:
@Stateless
public class LoginManagerBean extends BaseManagerBean implements LoginManager {
....
}
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:这是您正在执行的bean的名称 抬头。 bean名称通常是不合格的类名 bean实现类,但可以通过其中任何一个覆盖 ejb-jar.xml或通过注释。 bean名称部分不能为空 JNDI名称中的字符串。
但是,我似乎无法找到用于在注释中指定bean名称的注释。如果我阅读@EJB的文档,则说明beanName
参数为:
此引用映射到的Enterprise Java Bean的ejb-name
因此,从文档来看,beanName似乎不是正确的参数。
那么如何在映射中将我的EJB beanName重命名为我选择的东西?例如,我可以使用什么注释来读取映射:
ejb:myApp/myJar/MyReallyCoolName!LoginManager
答案 0 :(得分:3)
如果您正在使用JBossEAP 7 / WildFly 10.x,那么这是JavaEE 7,尽管相同的答案适用于Java EE 6.
您似乎只使用本地接口,因此您链接的所有指令都不适用,因为它们仅适用于远程EJB客户端。因此这些陈述:
在此上下文中,WF10将自动为此EJB创建JNDI映射,如下所示:
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"));
或使用注射:
@EJB(beanName="Foo")
private LoginManager loginManager;
顺便说一句,我只是在这里部署示例EJB jar(serverapp.jar)。如果您正在使用EAR文件,则某些名称会有一个额外的路径元素。