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

EJB 2.1 to EJB 3.1 Migration - Session EJB with name not found

I am migrating Ejb 2.1 to Ejb 3.1. I changed Java Version from 1.6 to 1.8, and Ejb Version from 2.1 to 3.1. Once I made the changes, I am getting problems in the ibm-ejb-jar-bnd.xml and ibm-ejb-jar-ext.xml files. I am getting these messages:

1: Session EJB with name 'abcEJB' not found
2: Resource reference with name 'ResourceRef_xyz' not found for this EJB or interceptor

Am I missing anything?


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

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

几年前我已经从 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 并抛出您自己的运行时异常

希望你觉得它有用。