【问题标题】:lookup to EJBHome from Outside the container via Standalone applicatiion failed通过独立应用程序从容器外部查找 EJBHome 失败
【发布时间】:2019-12-08 04:49:00
【问题描述】:

我有一个部署在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)

进一步研究我发现以下支持链接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 文件。谢谢!

【问题讨论】:

    标签: ejb websphere websphere-8


    【解决方案1】:

    在 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。项目/应用程序名称仅用于EAR 文件。

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

    【讨论】:

    • 谢谢。我尝试通过ejb/MyAppHome 查找我再次遇到相同的错误。对于CNTR0167I,我应该检查哪些日志? WebSphere 中有很多日志,例如 SystemOut.log、SystemErr.log、introspect.log 等。另外,我想澄清一下 Standalone 项目是一个简单的 java 程序,它不是 WAR 模块。
    • 对不起,ejb/MyAppHome 只是一个例子/猜测;人们经常在ejb 上下文中定义他们的EJB JNDI 名称,但这不是必需的。要使用的实际名称可以在CNTR0167I 消息中找到,该消息将在安装了 EJB 应用程序的服务器进程的 SystemOut.log 文件中。我所指的project name 是EJB 应用程序的,而不是客户端的。客户端项目名称不影响 EJB 的查找名称。
    • 不幸的是,确定 EJB 的 JNDI 查找名称可能很复杂,因为可以定义它的方式很多。本文详细描述它们:ibm.com/support/knowledgecenter/en/SS7K4U_9.0.5/… 无论 JNDI 名称是默认的还是在 ibm-ejb-jar-bnd.xml/xmi 中定义,CNTR0167I 消息都会记录应用程序启动时使用的实际 JNDI 名称,因此通常是确定要在查找时使用的正确 JNDI 名称的最简单和最可靠的方法。
    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 2021-06-14
    • 2013-06-02
    • 1970-01-01
    • 2019-05-03
    相关资源
    最近更新 更多