glassfish 3.1 jdni在EJB3上查找

时间:2011-04-29 06:56:18

标签: jndi

我有以下接口 MyLocalBean,MyRemoteBean 和无状态 MyBean 实现 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   的信息。

[\ EDIT]

[编辑]

嗨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:使用rebind来覆盖 [/编辑]

1 个答案:

答案 0 :(得分:1)

试试<ejb-link>MyEJB</ejb-link>。也就是说,test.ejb.MyLocalEJB听起来不像扩展EJBHome的home接口,所以也许你想使用<business-remote>而不是<remote><home>?如果您使用的是支持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