EJB 2.1到EJB 3.1迁移 - 找不到名称的会话EJB

时间:2017-02-10 19:34:50

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

  

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

     

1:会话EJB名称' abcEJB'找不到
   2:名称为资源引用' ResourceRef_xyz'找不到此EJB或拦截器

     

我错过了什么吗?

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

几年前我已经从EJB 2.1迁移到EJB 3.1,我回想起面临的相同问题和错误。

虽然我不记得解决问题的确切行动以及我在此过程中遇到的其他问题,但我会告诉你我采取了哪些措施来解决所有问题,包括这个问题。

注意:迁移并不是一件容易的事,但是按照上述后续步骤进行操作将会为您节省大量的麻烦。

  1. 使用正确的注释注释会话bean和接口: 在我的例子中,我有EJB 2.1 bean的远程接口。由于我的应用程序中不需要实际的远程接口,因此我将它们切换到本地接口。
  2. 清空ibm-ejb-jar-bnd.xml和ibm-ejb-jar-ext.xml enter image description here
  3. 使用DI,JNDI名称将客户端更改为查找。在我的例子中,我使用了JNDI查找。
  4. 现在代码应如下所示:

    会话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并抛出您自己的运行时异常

    希望你觉得它很有用。