【问题标题】:glassfish 3.1 jdni lookup on EJB3glassfish 3.1 在 EJB3 上查找 jdni
【发布时间】:2011-04-29 06:56:17
【问题描述】:

我有以下接口 MyLocalBean, MyRemoteBean 和无状态 MyBean implements MyLocalBean, MyRemoteBean 以下哪一项我不需要获得一个简单的java应用程序来测试这个...

ejb-jar.xml、glassfish-ejb-jar.xml、gf-client.jar

这里是 ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">
   <enterprise-beans>
      <session>
         <ejb-name>MyEJB</ejb-name>
         <home>test.ejb.MyLocalBean</home>
         <remote>test.ejb.MyRemoteBean</remote>
         <ejb-class>test.ejb.MyBean </ejb-class>
         <session-type>Stateless</session-type>
         <transaction-type>Container</transaction-type>
      </session>
   </enterprise-beans>
</ejb-jar>

这里缺少什么?我可以使用 MyEJB 进行查找吗?

这是我的查找代码

InitialContext ic;
ic = new InitialContext();
MyRemoteBean remoteBean = 
        (MyRemoteBean ) ic.lookup("java:comp/env/MyEJB");

[编辑]

我已将 ejb-jar.xml 更新如下

<enterprise-beans>
    <session>
        <ejb-name>MyEJB</ejb-name>
        <ejb-class>test.ejb.MyBean</ejb-class>
        <ejb-local-ref>
            <ejb-ref-name>MyEJB</ejb-ref-name>
            <ejb-ref-type>Session</ejb-ref-type>
            <local>test.ejb.MyLocalBean</local>
            <ejb-link>MyEJBClient.jar#MyEJB</ejb-link>
        </ejb-local-ref>
    </session>
</enterprise-beans>

我收到一个错误...

无法部署 MyBeanEAR 模块部署错误: MyBeanEAR:发生错误 部署期间:异常同时 部署应用程序 [MyBeanEAR] : 错误:未解决: MyEJBClient.jar#MyEJB。 请参阅 server.log 了解更多信息 详情。

[\编辑]

[编辑]

嗨,bkail,让我用正确的名称解决问题。最初,这是我的 eclipse-sts IDE 默认创建的

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">
  <display-name>BatchOverrideEJB</display-name>
  <ejb-client-jar>BatchOverrideEJBClient.jar</ejb-client-jar>
</ejb-jar>

这就是我尝试访问 EJB 的方式

Properties p = new Properties();
p.put("org.omg.CORBA.ORBInitialHost","localhost");
p.put("org.omg.CORBA.ORBInitialPort","3700");
InitialContext ctx = new InitialContext(p);

ic = new InitialContext(p);

BatchOverrideManagerRemote batchOverrideRemote = 
    (BatchOverrideManagerRemote) ic.lookup("java:comp/env/BatchOverrideEJB");

运行这个我得到以下错误

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at za.co.sanlam.batchovveride.test.BatchOverrideTester.main(BatchOverrideTester.java:33)

我认为这个错误意味着我的 EJB 没有绑定到上下文,所以我修改了 ejb-jar.xml 如下

<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">
    <enterprise-beans>
        <session>
            <ejb-name>BatchOverrideEJB</ejb-name>
            <ejb-class>com.test.ejb.BatchOverrideManagerBean</ejb-class>
            <ejb-local-ref>
                <ejb-ref-name>BatchOverrideEJB</ejb-ref-name>
                <ejb-ref-type>Session</ejb-ref-type>
                <local>com.test.batchoverridemanager.ejb.BatchOverrideManagerLocal</local>
                <ejb-link>BatchOverrideEJB</ejb-link>
            </ejb-local-ref>
        </session>
    </enterprise-beans>
</ejb-jar

但现在我得到 javax.naming.NameAlreadyBoundException: Use rebind to override [/编辑]

【问题讨论】:

    标签: jndi


    【解决方案1】:

    试试&lt;ejb-link&gt;MyEJB&lt;/ejb-link&gt;。也就是说,test.ejb.MyLocalEJB 听起来不像是扩展 EJBHome 的主界面,所以也许您打算使用&lt;business-remote&gt; 而不是&lt;remote&gt;&lt;home&gt;?如果您使用的是支持 EJB 3.1 的容器,您可能会发现只使用注解会更容易:

    @Stateless
    public class MyBean implements MyLocal { ... }
    @Local
    public interface MyLocal { ... }
    @Remote
    public interface MyRemote { ... }
    

    顺便说一句,MyLocalBeanMyRemoteBean 是业务接口的不寻常名称。通常,Bean 后缀是为 EJB 类本身保留的。

    编辑#2:

    关于第二次编辑,请参阅此链接:

    http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#nonJavaEEwebcontainerRemoteEJB

    【讨论】:

    • 嗨,bkail,我已经编辑了这个问题,因为我似乎无法回复我自己的问题。请考虑第二个Edit 部分.. 谢谢
    猜你喜欢
    • 2011-08-08
    • 2010-12-04
    • 2012-11-30
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2011-09-29
    • 2012-01-10
    相关资源
    最近更新 更多