2011-08-11 51 views
1

我試圖將多個對象傳遞給EJB遠程接口沒有部署Glassfish 3.1.1。無論是第一個對象,它都會通過罰款,第二個對象始終爲空。這是由於rmi-iiop的規格還是屬性設置?將多個對象傳遞給EJB遠程接口

這裏是我的屬性設置:

final Properties props = new Properties(); 
    props.setProperty(InitialContext.STATE_FACTORIES, 
      "com.sun.enterprise.naming.SerialInitContextFactory"); 
    props.setProperty("java.naming.factory.url.pkgs", 
      "com.sun.enterprise.naming"); 
    props.setProperty("java.naming.factory.state", 
      "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); 
     props.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.192"); 
     props.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); 
    // props.setProperty("com.sun.appserv.iiop.orbconnections","5"); 
    // Increase ORB Response Timeout to 5 min instead of 30 min: 
    // props.setProperty("com.sun.corba.ee.transport.ORBTCPTimeouts", 
    // "500:90000:20"); 
    props.setProperty(
      "com.sun.corba.ee.transport.ORBWaitForResponseTimeout", 
      "300000"); 
    try { 
     InitialContext ic=new InitialContext(props); 
     TestRemote remote=(TestRemote) ic.lookup("java:global/com.capmtech_test.ear-ear_ear_1.0-SNAPSHOT/test.ear-ejb-1.0-SNAPSHOT/Test!com.capmtech.TestRemote"); 


        Person p = new Person(); 
        p.setName("Smith"); 
        Phone m = new Phone(); 

      remote.test(p, m); 

    } catch (NamingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

這裏是無狀態的EJB:

@Stateless 
public class Test implements TestRemote { 
    @EJB 
    private PersonFacadeLocal personFacade; 

    @Override 
    public void test(Person person, Phone mobile) { 
     Person p = person; 
     p.setMobile(mobile); 
     personFacade.create(p); 
    } 

    // Add business logic below. (Right-click in editor and choose 
    // "Insert Code > Add Business Method") 

} 

在這種情況下,手機會一直爲空,如果我換了aruguments人會爲空!如果IP被設置爲本地主機,一切都會正常工作。

請幫

+0

你是什麼意思「通過多個對象」?你的意思是你在遠程接口上有兩個參數的方法,你的第一個參數是好的,但第二個參數是null?這似乎很奇怪。 –

+0

這正是我的意思。 – mjeragh

+0

我看到你設置了很多屬性來使它工作。根據[documentation](http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html),您應該使用無參數InitialContext()。設置IP地址時,行爲會發生變化,這很奇怪。也許你在設置/ etc/hosts的方式或防火牆方面遇到問題?關於/ etc/hosts配置,Glassfish是[picky](http://www.iniy.org/?p=275)。 – Jim

回答

0

替換以下行:

props.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.192"); 
    props.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); 

有:

props.setProperty(Context.PROVIDER_URL,"iiop://192.168.1.192:3700"); 
0

這一切都是假設你正在運行的GlassFish服務器,並在同一臺機器上的獨立客戶端。我能夠在這個領域重現一個問題。雖然這不完全是您的問題,但您可能會得到相同更改的結果。我在Windows Vista上運行GF 3.1。我的WINDOWS \ SYSTEM32 \ DRIVERS \ ETC \ hosts文件有以下幾行:

10.99.0.199 pc-2017.pgx.local 
127.0.0.1  localhost pc-2017.pgx.local 

當我的客戶端軟件連接:

props.put("org.omg.CORBA.ORBInitialHost", "localhost"); 

我得到的錯誤:

Exception in thread "main" javax.ejb.EJBException: java.rmi.RemoteException: CORBA INTERNAL 1330446421 No; nested exception is: 
    org.omg.CORBA.INTERNAL: ----------BEGIN server-side stack trace---------- 
org.omg.CORBA.INTERNAL: WARNING: IOP00710085: A reflective tie got an error while invoking method saveMonkey on class com.pts.monkey._MonkeySessionRemote_Remote 
    vmcid: OMG minor code: 85 completed: No 

但那麼如果我更改客戶端連接:

props.put("org.omg.CORBA.ORBInitialHost", "pc-2017.pgx.local"); 

它工作正常。