# NotSerializableException in EJB



## AlexSolo (27. Mai 2005)

Hallo,

ich programmiere mit NetBeans 4.1 und Sun Applications Server 8.1 eine J2EE Client-Server Anwendung. Als Datenbank verwende ich MySQL 4.1. Im Moment, wann der Client über SessionBean ein EntityBean-Object bekommen will, bekomme ich die folgende Fehlermeldung:

[#|2005-05-27T14:42:31.942+0200|WARNING|sun-appserver-pe8.1|javax.enterprise.resource.corba._CORBA_.util|_ThreadID=43;|"IOP00100006: (BAD_PARAM) Class com.sun.ejb.containers.EJBLocalObjectInvocationHandler is not Serializable"
org.omg.CORBA.BAD_PARAM:   vmcid: OMG  minor code: 6 completed: Maybe
        at com.sun.corba.ee.impl.logging.OMGSystemException.notSerializable(OMGSystemException.java:989)
        at com.sun.corba.ee.impl.logging.OMGSystemException.notSerializable(OMGSystemException.java:1004)
        at com.sun.corba.ee.impl.orbutil.ORBUtility.throwNotSerializableForCorba(ORBUtility.java:718)
        at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_abstract_interface(CDROutputStream_1_0.java:652)
        at com.sun.corba.ee.impl.encoding.CDROutputStream.write_abstract_interface(CDROutputStream.java:259)
        at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.writeAbstractObject(Util.java:462)
        at javax.rmi.CORBA.Util.writeAbstractObject(Util.java:129)
        at com.sun.corba.ee.impl.io.IIOPOutputStream.writeObjectField(IIOPOutputStream.java:724)
        at com.sun.corba.ee.impl.io.IIOPOutputStream.outputClassFields(IIOPOutputStream.java:790)
        at com.sun.corba.ee.impl.io.IIOPOutputStream.defaultWriteObjectDelegate(IIOPOutputStream.java:204)
        at com.sun.corba.ee.impl.io.IIOPOutputStream.outputObject(IIOPOutputStream.java:573)
        at com.sun.corba.ee.impl.io.IIOPOutputStream.simpleWriteObject(IIOPOutputStream.java:159)
        at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueInternal(ValueHandlerImpl.java:225)
        at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueWithVersion(ValueHandlerImpl.java:207)
        at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValue(ValueHandlerImpl.java:147)
        at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.writeRMIIIOPValueType(CDROutputStream_1_0.java:801)
        at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:850)
        at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:864)
        at com.sun.corba.ee.impl.encoding.CDROutputStream.write_value(CDROutputStream.java:242)
        at com.sun.corba.ee.impl.copyobject.ORBStreamObjectCopierImpl.copy(ORBStreamObjectCopierImpl.java:39)
        at com.sun.corba.ee.impl.copyobject.FallbackObjectCopierImpl.copy(FallbackObjectCopierImpl.java:34)
        at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.copyObject(Util.java:718)
        at javax.rmi.CORBA.Util.copyObject(Util.java:314)
        at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.copyResult(DynamicMethodMarshallerImpl.java:414)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:169)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(Unknown Source)
        at wts.ejb._EmployeeHistoryFacadeRemote_DynamicStub.ejbGetObject(_EmployeeHistoryFacadeRemote_DynamicStub.java)
        at wts.web.EmployeeHistoryMethods.getEmployeeHistory(EmployeeHistoryMethods.java:40)
        at wts.web.WTS_Login.processRequest(WTS_Login.java:49)
        at wts.web.WTS_Login.doPost(WTS_Login.java:108)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:767)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAsPrivileged(Subject.java:500)
        at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)
        at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:257)
        at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)
        at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:161)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
        at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:225)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:132)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:933)
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:184)
        at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:653)
        at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:534)
        at com.sun.enterprise.web.connector.grizzly.ProcessorTask.doTask(ProcessorTask.java:403)
        at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:55) 

Wenn der Client einen EntityBean-Attribut bekommen will, funktioniert es einwandfrei.

Wer kann mir helfen?

Danke im voraus.


----------



## Bleiglanz (27. Mai 2005)

ein client kann nicht "über eine Session an eine EJB" kommen

entweder er holt sich das Home der EJB selber (wenn diese ein Remote Home hat!)

oder von der Session Bean ein Value Object?!

willst du etwa ein EJBHandle oder die gefundene Referenz von der SessionBean an den Client zurückgeben?!!

Merke: ALLE PARAMETER UND RÜCKGABEWERTE MÜSSEN SERIALISIERBAR SEIN ODER ....(nochn paar andere erlaubt)

zeig mal den code


----------



## AlexSolo (27. Mai 2005)

Ich möchte ein Beispiel schreiben:

1.
//
// NotSerializableException
//
public EmployeeLocal getEmployeeByUUID(String uuid ) {
EmployeeLocal employee = EmployeeLocalHome.findByPrimaryKey(uuid);
  return employee;
}


2.
//
// Geht in Ordnung
//
public String getEmployeeFirstNameByUUID(String uuid) {
EmployeeLocal employee = EmployeeLocalHome.findByPrimaryKey(uuid);
  return employee.getFirstName();
}


----------



## Bleiglanz (27. Mai 2005)

ist dein client zufällig ein Remote Client???

der String ist natürlich serialisierbar und kann ohne probleme übers netz geschickt werden.

aber ein lokales Interface auf keinen Fall, ist doch nur eine Referenz auf etwas anderes

mach entweder den Employee selber Remote (indem du ihm ein RemoteInterface und ein RemoteHome verpasst) oder schick dem Client ein ValueObject

wobei letzteres aus verschiedenen gründen besser ist


----------

