Newsgroup: it.comp.java
Titolo: EJB & Serializable class

Un problema mi sta facendo impazzire, scusatemi se posto tutto il codice ma
è essenziale per comprendere la questione.
Il problema è il passaggio di
classi come parametri tra client e EJB remoti.
Questo è il codice che ho
realizzato per prova:
---------------------------------------------
La
classe che sarà passata come parametro implementa serializable:
// nella
sottodirectory Util
package Util;
import java.util.*;
public class
MiaClasse implements java.io.Serializable {
    private String nome;
private java.util.Date data;
    public MiaClasse (String nome,
java.util.Date data) {
        this.nome= nome;
        this.data=
data;
    }
    public String getNome() {
        return nome;
    }
public java.util.Date getData() {
        return data;
    }
public String toString() {
        String s = nome+ " " + data.toString();
return s;
    }
}
---------------------------------------------
Il
session bean, rispettivamente l'home e remote interface e il bean (nella
sottodir X)
package X;
import java.io.Serializable;
import
java.rmi.RemoteException;
import javax.ejb.CreateException;
import
javax.ejb.EJBHome;
public interface XHome extends EJBHome {
    XEJB
create() throws RemoteException, CreateException;
}
-------------------------------------
package X;
import Util.*;
import
java.util.*;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface XEJB extends EJBObject {
    public void crea(MiaClasse
c)
        throws RemoteException;
    public MiaClasse prendi()
throws RemoteException;
}
-------------------------------------------
package X;
import java.util.*;
import javax.ejb.*;
import
javax.naming.*;
import java.text.SimpleDateFormat;
import Util.*;
public class XBean implements SessionBean {
   public void
crea(MiaClasse c)  {
        try {
           String s= c.getNome();
java.util.Date d= c.getData();	
        } catch (Exception ex) {
throw new EJBException(ex.getMessage());
        }
    }
    public
MiaClasse prendi() {
		MiaClasse m=null;
        try {
		m= new
MiaClasse("Mario Rossi", new Date());
        } catch (Exception ex) {
throw new EJBException(ex.getMessage());
        }
        return m;
}
    public void ejbCreate() throws CreateException {}
    public void
ejbActivate() {}
    public void ejbPassivate() {}
    public XBean() {}
public void ejbRemove() {}
    public void
setSessionContext(SessionContext sc) {}
}
---------------------------------------------
Il Client (nella sottodir
Client)
package client; 
import java.util.*;
import java.io.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import
javax.rmi.PortableRemoteObject;
import java.text.*;
import X.*;
import
Util.*;
public class Client {
   public static void main(String[]
args) {
       try {
       Properties prop = new Properties();
prop.setProperty
(Context.INITIAL_CONTEXT_FACTORY,"com.sun.enterprise.naming.SerialInitContextFactory");
prop.setProperty (Context.PROVIDER_URL,"IIOP://localhost:1050");
Context initial = new InitialContext(prop);
      Object objref =
initial.lookup("MyX");
      XHome home =
(XHome)PortableRemoteObject.narrow(objref, XHome.class);
      XEJB
myejb = home.create();
      MiaClasse c=null;
      c = myejb.prendi();
System.out.println(c.getNome()+" "+c.getData());  
      c=new
MiaClasse("Zorro",new Date());
      myejb.crea(c);
 
      }
catch (Exception ex) {
           System.err.println("Caught an
exception:");
           ex.printStackTrace();
           }
     } //
main
} 
Ho fatto il deployment con il deploytool sul server j2ee
(fornito dalla sun).
Lancio il client tramite: runclient .... e tutto
funziona bene, cioè la MiaClasse riesce a "passare" in entrambi i versi.
Lancio il client tramite: java -Dorg.omg.CORBA.ORBInitialHost=127.0.0.1
-classpath .\j2ee.jar;.;.\PROVAClient.jar client/Client
e riesce ad
eseguire il metodo "prendi" per cui dal server al client la MiaClasse
passa, mentre da errore quando il client chiama il metodo "crea".
L'errore
è:
java.rmi.MarshalException: CORBA MARSHAL 1398079699 Maybe; nested
exception is:
org.omg.CORBA.MARSHAL:   minor code: 1398079699 completed:
Maybe
org.omg.CORBA.MARSHAL:   minor code: 1398079699 completed: Maybe
at java.lang.Class.newInstance0(Native Method)
        at
java.lang.Class.newInstance(Class.java:237)
        at
com.sun.corba.ee.internal.iiop.messages.ReplyMessage_1_2.getSystemExc
eption(ReplyMessage_1_2.java:93)
        at
com.sun.corba.ee.internal.iiop.ClientResponseImpl.getSystemException(
ClientResponseImpl.java:108)
        at
com.sun.corba.ee.internal.POA.GenericPOAClientSC.invoke(GenericPOACli
entSC.java:136)
        at
org.omg.CORBA.portable.ObjectImpl._invoke(ObjectImpl.java:297)
        at
X._XEJB_Stub.crea(Unknown Source)
        at
client.Client.main(Client.java:31)
Aggiungo che se invece di passare
MiaClasse come parametro passo parametri del tipo String e Date
direttamente (riscrivendo il metodo "crea") non si verifica alcun errore.
Mi chiedo, è il runclient che fa magie o mi sfugge qualcosa di importante?
Ringrazio anticipatamente chi mi dedicherà 5 minuti.
Ciao
--------------------------------
Inviato via 
http://usenet.iol.it

 exception is:
La maggior parte delle volte che ho visto questo errore dipendeva da un
errato CLASSPATH, nonostante fossi sicuro di aver fatto tutto nel modo
corretto. Sei sicuro di includere correttamente il jar quando "esegui"
il client? Magari stai includendo un jar di un altro client, oppure una
"vecchia" versione, oppure hai messo una minuscola al posto di una
maiuscola (sei su Windos, mi sembra di vedere dal CLASSPATH). Prova a
vedere se l'errore che ti da e' identico se *non* includi il client.jar
nel CLASSPATH, e poi ricontrolla con il metodo "scientifico" che la VM
abbia effettivamente visibilita' sugli stub (magari hai inserito nel
CLASSPATH in uno script una qualche classe che "nasconda" il client
corretto, errore ancora piu' subdolo).
Insomma, secondo me il tuo codice non ha nulla che non va (non che
l'abbia guardato, ma mi fido :))
ciao
uL

 č:


ciao


 stub del bean.
Cosa ti dice invece se *non* includi il client.jar nel cp? (ma perche'
non usi tutte minuscole? E' una bella misura preventiva...;))

 gli stub del bean. 
Ugo diceva "scientfiche" proprio perche' i "mi pare" non ci siano. ;-) 
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

non usi tutte minuscole? E' una
bella misura preventiva...;))
Mi dice che non trova (ovviamente) la
classe Client.
Ho provato di tutto e posso assicurare che i file
_XEJB_Stub.class
_XHome_Stub.class
appartengono al classpath.
Ho
addirittura ricompilato tutte le classi in un unica directory senza
specificare i package, e rifatto il deploy. Ma facendo partire il client
(dopo aver settato opportunamente il CP) si ripresenta l'errore al momento
di trasferire una classe come parametro dal client all'ejb remoto (il
viceversa funziona).
Non so + che prove fare. Ormai mi rimane solo di
andare ad acquistare una camicia di forza :-)
Ciao e grazie cmq


 Ciao e grazie cmq
se mi mandi il tutto, qunado ho un attimo di tempo provo a fartelo
girare (sono quasi sicuro che e' qualcosa di accessorio al codice e non
il codice stesso)
ciao
uL