我编写了一个示例EJB类,如下所示:
@Stateless(mappedName = "BusinessSLSB")
@Local(BusinessLocal.class)
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public class BusinessSLSB implements BusinessLocal{
//body of the class
}
我在同一个项目中有一个非EJB类,我尝试按以下方式查找文件:
public class GetTransactionData {
private BusinessLocal business;
public GetTransactionDataForMercury(){
notifier.info("Creating an object of GetTransactionData");
try{
InitialContext ctx = new InitialContext();
business = (BusinessLocal) ctx.lookup("BusinessSLSB");
}catch(Exception ne){
notifier.error("Error occurred --> " + ne.getMessage());
}
}
当我执行代码时,我收到以下异常:
Error occurred --> Unable to resolve BusinessSLSB. Resolved '
我在提供查找名称时出错了吗?我该如何解决这个问题?
答案 0 :(得分:1)
不能使用mappedName。因此,您不能假设您通过该属性分配的名称将始终最终成为顶级JNDI名称。
您使用的是哪台服务器?如果它支持EJB 3.1,则删除mappedName并使用可移植JNDI名称。否则,无论如何都要删除mappedName,并找出您的服务器分配的专有JNDI名称。许多人会在启动时在日志中打印出来。
答案 1 :(得分:0)
我找到了解决这个问题的方法。解决方案是在web.xml文件中添加以下行:
<ejb-local-ref>
<ejb-ref-name>ejb/BusinessLocal</ejb-ref-name>
<local>dk.tdc.soa.smo.draco.ejb.BusinessLocal</local>
</ejb-local-ref>
以及GetTransactionData中的以下行:
public class GetTransactionData {
private BusinessLocal business;
public GetTransactionDataForMercury(){
notifier.info("Creating an object of GetTransactionData");
try{
InitialContext ctx = new InitialContext();
business = (BusinessLocal) ctx.lookup("java:comp/env/ejb/BusinessLocal");
}catch(Exception ne){
notifier.error("Error occurred --> " + ne.getMessage());
}
}