通过独立应用程序从容器外部查找 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!FullyQualifiedNameOfRemoteInterface or BeanName#FullyQualifiedNameOfRemoteInterface.
如果它是正确的修复。我在哪里可以找到项目名称、模块名称和 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:global
和 SERVERROOT
名称上下文中都会为 JNDI 名称记录一个 CNTR0167I
。因此,在上面的错误场景中,EJB 可能绑定到 ejb/MyAppHome
而不仅仅是 MyAppHome
,因此您还可以从 [=11] 中确定正确的 SERVERROOT
JNDI 名称=] 消息也是如此。任一 JNDI 名称都可用于查找 EJB。
我有一个部署在 WebSphere 8
我正在尝试按照以下方式从独立 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!FullyQualifiedNameOfRemoteInterface or BeanName#FullyQualifiedNameOfRemoteInterface.
如果它是正确的修复。我在哪里可以找到项目名称、模块名称和 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:global
和 SERVERROOT
名称上下文中都会为 JNDI 名称记录一个 CNTR0167I
。因此,在上面的错误场景中,EJB 可能绑定到 ejb/MyAppHome
而不仅仅是 MyAppHome
,因此您还可以从 [=11] 中确定正确的 SERVERROOT
JNDI 名称=] 消息也是如此。任一 JNDI 名称都可用于查找 EJB。