【问题标题】: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.xml 和 ibm-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,我记得遇到过与您相同的问题和错误。
虽然我不记得解决问题的确切措施,也不记得我在此过程中遇到的其他问题,但我会告诉你我做了什么来解决所有问题,包括这个问题。
注意:迁移不是一件容易的事,但按照所描述的这些后续步骤将在以后为您省去很多麻烦。
- 使用适当的注释注释会话 bean 和接口:
就我而言,我有 EJB 2.1 bean 的远程接口。由于我的应用程序中不需要实际的远程接口,因此我将它们切换为本地接口。
- 空的 ibm-ejb-jar-bnd.xml 和 ibm-ejb-jar-ext.xml
- 将客户端更改为使用 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 文件中,<session> 元素必须包含它适用的 EJB 的名称。该名称必须与在相应的 ejb-jar.xml 文件中定义的 EJB 的名称相匹配,特别是 <ejb-name> 元素,或者由 @Stateless、@Stateful 或 @Singleton 注释标识的 EJB 的名称。使用注解时,名称指注解的名称属性或简单的类名。
同样,<resource-ref> 元素必须包含它所应用的资源引用的名称。在 ejb-jar.xml 中,这将是 <res-ref-name> 元素。如果资源引用是通过注解定义的,则为 @Resource 注解的名称元素,如果未指定,则为默认名称。