Newsgroup: it.comp.java
Titolo: EJB - passare un reference di un entity ottenuto da un' applicazione client ud un session sul server

Ciao a tutti. Sto cercando di imparare J2EE, e a questo scopo ho fatto un piccolo
esercizietto che perň ... non funziona :-).
La mia applicazione client ha il seguente codice:
....
Object dipendenteObject = home.findByPrimaryKey(dKey);
Dipendente dipendente=
	(Dipendente)PortableRemoteObject.narrow(dipendenteObject,Dipendente.class);
Object obj1 = ctx.lookup("CreatoreRichiestaHome");
 
CreatoreRichiestaHome creatoreHome=
(CreatoreRichiestaHome)PortableRemoteObject.narrow(obj1,CreatoreRichiestaHome.class);
CreatoreRichiesta creatoreRichiesta = 
	creatoreHome.create((Dipendente)dipendenteObject);
 
creatoreRichiesta.sayHello();
.....
Dipendente č un Entity Bean CMP, mentre CreatoreRichiesta č un Session Bean stateful.
Il servizio creaRichiesa(int unNumero) - (nel SessionBean) -, adopera un servizio del
Dipendente, che viene passato (come si vede dal codice), nella create del Session.
public class CreatoreRichiestaBean implements SessionBean 
{
	public Dipendente suoDipendente;
	public SessionContext suoCtx;
 
	public void sayHello()throws RemoteException
	{
		try
		{
			System.out.println
				(
				   "hello "+suoDipendente.getCognome()
				 );
		}
		catch(Exception ex)
		{ex.printStackTrace();}
	}
	public void ejbCreate(Dipendente dipendente)throws CreateException 
	{
		suoDipendente = dipendente;
		System.out.println("ejbCreate()");
	}
.....
}
Il problema č: la stampa all'interno del try non viene eseguita in quanto (almeno credo)
il reference che passo nella create dall'applicazione client, non viene adoperato in
CreatoreRichiestaBean. Come devo fare? 
Grazie in anticipo per le eventuali risposte.
DanJ


Dan, ho trovato io il problema, era una ingenuita' che avete commesso nell'implementare il
metodo equals() della primary key.
Nella equals() dell'oggetto c'era questo codice che causava una ClassCastException:
    public boolean equals(Object dip)
    {
        DipendentePK dipPk = (DipendentePK)dip;
        return dipendenteID.equals(dipPk.dipendenteID);
    }
E' stato sufficiente cambiarlo in questo modo:
    public boolean equals(Object dip)
    {
        boolean equals = false;
 
        try
        {
            DipendentePK dipPk = (DipendentePK)dip;
            equals = dipendenteID.equals(dipPk.dipendenteID);
        }
        catch (Exception ex) {}
 
        return equals;
    }
Come ho fatto a trovarlo? Il problema e' che nello stacktrace() del server non compariva
tutto il trace, ma solo una parte: quella piu' importante era "nascosta", veniva fuori
qualcosa del genere:
java.rmi.ServerException: RemoteException occurred in server thread; nested exce
ption is:
        java.rmi.RemoteException: nested exception is: java.lang.ClassCastExcept
ion: com.sun.ejb.containers.EntityContainer$EJBTxKey; nested exception is:
        java.lang.ClassCastException: com.sun.ejb.containers.EntityContainer$EJB
  [... omissis mia]
        at sample.DipendenteBean_PM_EJBObjectImpl.getCognome(DipendenteBean_PM_E
JBObjectImpl.java:95)
        ... 19 more
In pratica mancavano 19 linee di stack! Allora, siccome la RemoteException conserva al suo
interno l'eccezione scatenante sul server, ho inserito questo codice per catchare e
stampare l'eccezione "vera":
    catch(Throwable     
    {
        while(ex instanceof RemoteException)
	    ex = ((RemoteException)ex).detail;
        ex.printStackTrace();
    }
E uala', ecco che l'eccezione si e' trasformata in qualcosa di piu' comprensibile:
java.lang.ClassCastException: com.sun.ejb.containers.EntityContainer$EJBTxKey
        at sample.DipendentePK.equals(Unknown Source)
  [... omissis mia]
Corretto il codice, rideployato con ant, tutto ok!
Ciao,
    Bruno.
P.S.
Io e Dan lavoriamo separati da una parete :-)
---
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola