通过独立应用程序从容器外部查找 EJBHome 失败

lookup to EJBHome from Outside the container via Standalone applicatiion failed

我有一个部署在 WebSphere 8

中的 EJB 应用程序

我正在尝试按照以下方式从独立 java 程序连接它

public static void main (String[] args) throws Exception
{
    Properties props = new Properties();
    props.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
    props.put(javax.naming.Context.PROVIDER_URL, "iiop//localhost:2809");
    Context ctx = new InitialContext(props);
    Object o = ctx.lookup("MyAppHome");

}

但这会导致以下异常

javax.naming.NameNotFoundException: Name "MyAppHome" not found in context 
"serverlocal:CELLROOT/SERVERROOT".
at com.ibm.ws.naming.ipbase.NameSpace.lookupInternal(NameSpace.java:1228)

进一步研究我发现以下支持 link https://www.ibm.com/developerworks/community/forums/html/threadTopic?id=ac01caaf-d2aa-4f3f-93b3-6f3d4dec3e6b

这里回答者建议使用完全限定的 bean 名称

java:global/ProjectName/ModuleName/BeanName!FullyQualif‌​iedNameOfRemoteInterface or BeanName#FullyQualif‌​iedNameOfRemoteInterface.

如果它是正确的修复。我在哪里可以找到项目名称、模块名称和 Bean 名称?我的项目中确实有 xmi 个文件。谢谢!

在 WebSphere 中确定 EJB 的 JNDI 名称的最简单方法是在服务器日志中查找绑定信息。使用消息 ID CNTR0167I 记录与每个 EJB 接口关联的 JNDI 名称。例如:

CNTR0167I: The server is binding the com.example.DatabaseBean interface of the DatabaseBean enterprise bean in the TestProject.war module of the TestProject application. The binding location is: java:global/TestProject/DatabaseBean!com.example.DatabaseBean

请注意,在此示例中似乎没有同时存在 project name(即应用程序名称)和 module name,因为此测试项目是一个独立的 WAR 模块EJB封装在里面。 Project/Application 名称仅用于 EAR 个文件。

另请注意,在 java:globalSERVERROOT 名称上下文中都会为 JNDI 名称记录一个 CNTR0167I。因此,在上面的错误场景中,EJB 可能绑定到 ejb/MyAppHome 而不仅仅是 MyAppHome,因此您还可以从 [=11] 中确定正确的 SERVERROOT JNDI 名称=] 消息也是如此。任一 JNDI 名称都可用于查找 EJB。