【问题标题】:Can I add a JNDI Binding with a customized name for inject a Stateless Bean on my client Servlet?我可以添加一个具有自定义名称的 JNDI 绑定,以便在我的客户端 Servlet 上注入一个无状态 Bean 吗?
【发布时间】:2015-08-12 04:24:35
【问题描述】:

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

    @Stateless(name = "ejbBean")
    @Remote(TimedBean.class)
    public class TimedBeanImpl implements TimedBean
    ...

另一方面,我有一个 Servlet 客户端,我需要在其中注入此 EJB bean 以调用其操作。注入指的是服务器自动生成的一个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 是不同的。
  • 这取决于包装。 Not is the same 指的是在 EAR 文件中部署的 ejbBean 与在 WAR 文件中部署的不同。
  • 这取决于工件的版本。更多变化。

我想,如果可能的话,就是为bean指定一个唯一的名字,可以在每个服务器中引用servlet,对每个版本进行打包,以便在开发中不必进行不断的更改,避免出现错误部署。

您好!

【问题讨论】:

    标签: servlets ejb jndi java-ee-6 inject


    【解决方案1】:

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

    【讨论】:

    • 感谢@bkail 的回复。事实是他没有查看查找属性。我考虑到。除了您描述的缓解问题的这些机制之外,我发现如果我使用符号 ejb 没有参数也恢复了 bean 的实例。我知道如果远程接口的实现不止一个,则此解决方案无效,除此之外,我会知道如何按缺陷进行查找。我会继续调查。
    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2013-09-25
    • 2021-06-17
    • 2015-11-05
    • 2011-06-14
    相关资源
    最近更新 更多