Servlets 我可以添加一个带有自定义名称的JNDI绑定,以便在我的客户机Servlet上注入一个无状态Bean吗?

Servlets 我可以添加一个带有自定义名称的JNDI绑定,以便在我的客户机Servlet上注入一个无状态Bean吗?,servlets,ejb,jndi,java-ee-6,inject,Servlets,Ejb,Jndi,Java Ee 6,Inject,一方面,我有一个实现远程接口的无状态EJB Bean @Stateless(name = "ejbBean") @Remote(TimedBean.class) public class TimedBeanImpl implements TimedBean ... 另一方面,我有一个Servlet客户端,我需要在其中注入这个ejbbean来调用它的操作。注入引用服务器自动生成的JNDI: public class LoadTimer implements Ser

一方面,我有一个实现远程接口的无状态EJB Bean

    @Stateless(name = "ejbBean")
    @Remote(TimedBean.class)
    public class TimedBeanImpl implements TimedBean
    ...
另一方面,我有一个Servlet客户端,我需要在其中注入这个ejbbean来调用它的操作。注入引用服务器自动生成的JNDI:

public class LoadTimer implements ServletContextListener {
    // EAR Local Mapping - EAR Dev Mapping
    // @EJB(mappedName = "java:global/appTest/appTestModuleOne-01.00.00/ejbBean")
    @EJB(mappedName = "java:global/appTest-01.00.00/appTestModuleOne-01.00.00/ejbBean")
    private TimedBean timedBean;

    @Override
    public void contextInitialized(ServletContextEvent servletcontextevent) {
...
它起作用了

但引用自动生成的jndi的事实使得解决方案高度依赖于特定环境:

  • 这取决于服务器。例如,我的本地测试服务器是JBOSS 7.1,而我的开发服务器是JBOSS EAP 6.2,自动生成的jndi是不同的
  • 这取决于包装。在EAR文件中部署的ejbBean与在WAR文件中部署的ejbBean不同
  • 这取决于工件的版本。更多的变化
如果可能的话,我想为bean指定一个唯一的名称,可以在每个服务器、每个版本和包中引用servlet,以便不必在开发中不断更改,避免部署中出现错误


你好

您可以在application.xml中使用
,在模块描述符(web.xml或ejb jar.xml)中使用
,以减少硬编码的版本号。(注意,从EE 6开始,您应该使用
@EJB(lookup=“…”)
而不是mappedName。)规范还要求您的应用程序服务器在部署应用程序时为您提供覆盖
@EJB
引用的查找名称的选项,因此,开发时应用程序中的硬编码应该无关紧要。

感谢@bkail的回复。事实上,他没有检查lookup属性。我考虑到了。除了您描述的这些缓解问题的机制之外,我还发现,如果使用表示法ejb,则无参数也可以恢复bean的实例。我知道如果远程接口有多个实现,这个解决方案是无效的,除此之外,我知道如何按缺陷进行查找。我会继续调查。