【问题标题】:EJB 2.1 to EJB 3.1 Migration - Session EJB with name not foundEJB 2.1 到 EJB 3.1 迁移 - 找不到名称的会话 EJB
【发布时间】:2017-02-10 19:34:50
【问题描述】:

我正在将 Ejb 2.1 迁移到 Ejb 3.1。我将 Java 版本从 1.6 更改为 1.8,并将 Ejb 版本从 2.1 更改为 3.1。进行更改后,我在 ibm-ejb-jar-bnd.xmlibm-ejb-jar-ext.xml 文件中遇到问题。 我收到这些消息:

1:未找到名称为“abcEJB”的会话 EJB
2:未找到此 EJB 或拦截器的名称为“ResourceRef_xyz”的资源引用

我错过了什么吗?


【问题讨论】:

    标签: java ejb websphere ejb-3.1 ejb-2.x


    【解决方案1】:

    几年前我已经从 EJB 2.1 迁移到 EJB 3.1,我记得遇到过与您相同的问题和错误。

    虽然我不记得解决问题的确切措施,也不记得我在此过程中遇到的其他问题,但我会告诉你我做了什么来解决所有问题,包括这个问题。

    注意:迁移不是一件容易的事,但按照所描述的这些后续步骤将在以后为您省去很多麻烦。

    1. 使用适当的注释注释会话 bean 和接口: 就我而言,我有 EJB 2.1 bean 的远程接口。由于我的应用程序中不需要实际的远程接口,因此我将它们切换为本地接口。
    2. 空的 ibm-ejb-jar-bnd.xml 和 ibm-ejb-jar-ext.xml
    3. 将客户端更改为使用 DI、JNDI 名称进行查找。在我的例子中,我使用了 JNDI 查找。

    现在代码应该是这样的:

    会话 Bean 接口:

    @Local
    public interface MySessionInterface {
        // TODO :: declare business methods
    }
    

    会话 bean 实现:

    @stateless
    public interface MySessionBeanImpl implements MySessionInterface {
        // TODO :: implement business methods
    }
    

    使用 JNDI 查找 EJB 的服务定位器:

    public class ServiceLocator {
        public final <T> T getLocalSession(Class<T> _class) throws NamingException {
            return (T) new InitialContext().lookup("ejblocal:" + _class.getName());
        }
    }
    

    客户:

    public class SessionClient {
         public void performOperation() {
             try {
                MySessionInterface session = ServiceLocator.getLocalSession(MySessionInterface.class);
                // TODO :: perform business logic here
            } catch (NamingException e) {
                 // TODO :: handle exception
            }
        }
    }
    

    当然服务定位器可以有以下改进,但为简洁起见,我删除了它们:

    • 缓存结果而不是每次都从 JNDI 中查找
    • 捕获检查的异常 NamingException 并抛出你自己的运行时异常

    希望你觉得它有用。

    【讨论】:

      【解决方案2】:

      在 ibm-ejb-jar-bnd.xml 和 ibm-ejb-jar-ext.xml 文件中,&lt;session&gt; 元素必须包含它适用的 EJB 的名称。该名称必须与在相应的 ejb-jar.xml 文件中定义的 EJB 的名称相匹配,特别是 &lt;ejb-name&gt; 元素,或者由 @Stateless、@Stateful 或 @Singleton 注释标识的 EJB 的名称。使用注解时,名称指注解的名称属性或简单的类名。

      同样,&lt;resource-ref&gt; 元素必须包含它所应用的资源引用的名称。在 ejb-jar.xml 中,这将是 &lt;res-ref-name&gt; 元素。如果资源引用是通过注解定义的,则为 @Resource 注解的名称元素,如果未指定,则为默认名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多