我正在将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或拦截器我错过了什么吗?
答案 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,我回想起面临的相同问题和错误。
虽然我不记得解决问题的确切行动以及我在此过程中遇到的其他问题,但我会告诉你我采取了哪些措施来解决所有问题,包括这个问题。
注意:迁移并不是一件容易的事,但是按照上述后续步骤进行操作将会为您节省大量的麻烦。
现在代码应如下所示:
会话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
}
}
}
当然,服务定位器可以有以下改进,但我为了简洁起见删除了它们:
希望你觉得它很有用。