在Weblogic 10.x.x上使用InitialContext查找EJB

7

请问如何在Weblogic上查找EJB?
我有以下的bean:

@Stateless
@EJB(name = "DataAccess", beanInterface = DataAccessLocal.class)
public class DataAccess implements DataAccessLocal {
    ...
}

我需要在另一个不是托管内容(只是普通类的)类中使用这个bean,所以我猜应该这样做:

DataAccessLocal dataAccess = DataAccessLocal.class.cast((new InitialContext()).lookup("%SOME_JNDI_NAME%"));

问题是在Weblogic 10.x.x AS的情况下,应该使用什么作为%SOME_JNDI_NAME%?任何帮助将不胜感激。

我已经在另一个地方回答了这个问题:http://stackoverflow.com/questions/676926/giving-an-ejb-a-jndi/677008#677008 - Nuno Furtado
谢谢@Nuno。它只适用于远程接口吗?还是本地也可以? - kardanov
不确定这个,因为我一直只在使用远程接口。 - Nuno Furtado
1个回答

9

我会将你的EJB类更新为以下形式:

@Stateless(name="DataAccessBean", mappedName="ejb/DataAccessBean")
@Remote(DataAccessRemote.class)
@Local(DataAccessLocal.class)
public class DataAccess implements DataAccessLocal, DataAccessRemote {
    ...
}

从部署在同一EAR中的类(使用本地接口)查找EJB:

InitialContext ctx = new InitialContext(); //if not in WebLogic container then you need to add URL and credentials.
// use <MAPPED_NAME>
Objet obj = ctx.lookup("java:comp/env/ejb/DataAccessBean");

通常情况下,EJB注入是首选的,您可以按照以下方式进行操作:
@EJB(name="DataAccessBean")
DataAccessLocal myDataAccessBean;

如果你想远程使用EJB,则需要使用远程接口和以下JNDI名称:
DataAccessBean#<package>.DataAccessRemote

谢谢 @Jeff,我刚刚尝试了一下(使用本地接口),并得到了以下异常:(我没有完整的堆栈跟踪,但主要部分是)"remaining name: env/ejb/DataAccessBean"。你有什么想法吗? - kardanov
很高兴通过电子邮件(jeffrey.west@oracle.com)提供帮助。当我们完成后,我们可以在这里发布解决方案... - Jeff West
此外,如果您正在尝试从EJB部署之外的EAR访问EJB,或者如果EJB部署在自己的ejb-jar中,则需要使用远程方法。 - Jeff West
到目前为止,对我来说使用远程接口已经足够了,但这很奇怪,因为我是从同一个EAR中进行调用的。如果您有任何关于问题的想法,如果您能让我知道就太好了。谢谢。 - kardanov
生成的 JNDI 名称仅适用于远程接口类。在 WebLogic 10.3.x 中,本地接口不会添加到 JNDI。我在这里更详细地描述了这一点。 - pharsicle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接