ejb error((MARSHAL) Could not find class) when using OneToMany relationship
I am using Netbeans 5.5 with J2EE App Server 9. I have two entity beans with a OneToMany Uni-directional relationship. I have a Remote Stateless session bean which has persistence operations for creating and searching etc.. I am accessing the remote bean via jndi from a j2ee java client. The access works fine. The session bean persist operation creates data in both the entities (cascade persist).
But, after the data is created, when I access the entity manager find() method from the session bean via the client errors out. This error only happens for the entities with OneToMany relationship, not for OneToOne relationships.
I am using TOPLINK persistence provider accessing a derby data source. I have the latest persistence library jar files in the library classpath.
client code:
Phone p1 =new Phone();
p1.setPnumber("999 999 9999");
Customer c1 =new Customer();
c1.setLname("Smith");
c1.getPhone().add(p1);
int pk = agent.createCustomer(c1);// creates the entities
Customer c2 = agent.findCustomer(pk);// this causes the ERROR
session bean code:
@PersistenceContextprivate EntityManager em;
publicint createCustomer(Customer c){
em.persist(c);
return c.getId();
}
public Customer findCustomer(int i){// this causes the ERROR
return em.find(Customer.class, i);
}
exception:
Mar 30, 2007 3:25:00 PM com.sun.corba.ee.impl.encoding.CDRInputStream_1_0 read_value
WARNING: "IOP00810257: (MARSHAL) Could not find class"
org.omg.CORBA.MARSHAL:vmcid: SUN minor code: 257 completed: Maybe
at com.sun.corba.ee.impl.logging.ORBUtilSystemException.couldNotFindClass(ORBUtilSystemException.java:8309)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:984)
at com.sun.corba.ee.impl.encoding.CDRInputStream.read_value(CDRInputStream.java:259)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:1987)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:2211)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStream.java:1219)
at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:398)
***exception in Client_1 ***
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:329)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:295)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1005)
at com.sun.corba.ee.impl.encoding.CDRInputStream.read_value(CDRInputStream.java:259)
at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl$14.read(DynamicMethodMarshallerImpl.java:333)
at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.readResult(DynamicMethodMarshallerImpl.java:424)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:162)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:119)
at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:197)
at com.titan.ejb.__Tester1Remote_Remote_DynamicStub.findCustomer(__Tester1Remote_Remote_DynamicStub.java)
at com.titan.ejb._Tester1Remote_Wrapper.findCustomer(com.titan.ejb._Tester1Remote_Wrapper.java)
at com.titan.clients.Client_1.main(Client_1.java:37)
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:585)
at com.sun.enterprise.util.Utility.invokeApplicationMain(Utility.java:232)
at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:329)
at com.sun.enterprise.appclient.Main.main(Main.java:180)
Caused by: java.lang.ClassNotFoundException
... 25 more
javax.ejb.EJBException: nested exception is: java.rmi.MarshalException: CORBA MARSHAL 1398079745 Maybe; nested exception is:
org.omg.CORBA.MARSHAL:vmcid: SUN minor code: 257 completed: Maybe
java.rmi.MarshalException: CORBA MARSHAL 1398079745 Maybe; nested exception is:
org.omg.CORBA.MARSHAL:vmcid: SUN minor code: 257 completed: Maybe
at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:224)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:172)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:119)
at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:197)
at com.titan.ejb.__Tester1Remote_Remote_DynamicStub.findCustomer(__Tester1Remote_Remote_DynamicStub.java)
at com.titan.ejb._Tester1Remote_Wrapper.findCustomer(com.titan.ejb._Tester1Remote_Wrapper.java)
at com.titan.clients.Client_1.main(Client_1.java:37)
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:585)
at com.sun.enterprise.util.Utility.invokeApplicationMain(Utility.java:232)
at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:329)
at com.sun.enterprise.appclient.Main.main(Main.java:180)
Caused by: org.omg.CORBA.MARSHAL:vmcid: SUN minor code: 257 completed: Maybe
at com.sun.corba.ee.impl.logging.ORBUtilSystemException.couldNotFindClass(ORBUtilSystemException.java:8309)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:984)
at com.sun.corba.ee.impl.encoding.CDRInputStream.read_value(CDRInputStream.java:259)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:1987)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:2211)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStream.java:1219)
at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:398)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:329)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:295)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1005)
at com.sun.corba.ee.impl.encoding.CDRInputStream.read_value(CDRInputStream.java:259)
at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl$14.read(DynamicMethodMarshallerImpl.java:333)
at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.readResult(DynamicMethodMarshallerImpl.java:424)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:162)
... 12 more
Caused by: java.lang.ClassNotFoundException
... 25 more
javax.ejb.EJBException: nested exception is: java.rmi.MarshalException: CORBA MARSHAL 1398079745 Maybe; nested exception is:
org.omg.CORBA.MARSHAL:vmcid: SUN minor code: 257 completed: Maybe
at com.titan.ejb._Tester1Remote_Wrapper.findCustomer(com.titan.ejb._Tester1Remote_Wrapper.java)
at com.titan.clients.Client_1.main(Client_1.java:37)
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:585)
at com.sun.enterprise.util.Utility.invokeApplicationMain(Utility.java:232)
at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:329)
at com.sun.enterprise.appclient.Main.main(Main.java:180)
# 1
It appears to be a bug in Netbeans.
I have a similar error message with the following settings:
A session bean remote interface
be.macharis.toon.pacita.common.OriginFacadeRemote
A session bean implementing the remote interface
be.macharis.toon.pacita.common.OriginFacade
At deploying the ejb module, the session bean is loaded in the JNDI registry under the name be.macharis.toon.pacita.common.OriginFacadeRemote
(the server log says so).
I have the following code in a servlet:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
...
try {
Context ic = new InitialContext();
OriginFacadeRemote originFacade = (OriginFacadeRemote)ic.lookup(OriginFacadeRemote.class.getName());
...
originFacade.setOrigin(componentRegistry, OriginFacadeRemote.ELEMENT_CONTAINER); // <- exception here
} catch (NamingException e) {
e.printStackTrace();
}
Yet I get a java.lang.ClassNotFoundException
during the EJB method call. The exception does not take place during execution of the method, but before, while the EJB container is still resolving the method. It thus must be a(nother) bug in the implementation of the EJB container.
And bugs that are outside your control are so much harder to deal with... There was another bug in the EJB container for serialising complex object that I could work around by explicitly serialising the Objects myself to byte arrays. It took me 5 days to do so. I don't know if I will manage to work around this bug. If I do, I will post my solution. For completeness, below my "clarifying" error dump:
javax.ejb.EJBException: nested exception is: java.rmi.MarshalException: CORBA MARSHAL 1398079745 Maybe; nested exception is:
org.omg.CORBA.MARSHAL: -BEGIN server-side stack trace-
org.omg.CORBA.MARSHAL:vmcid: SUN minor code: 257 completed: Maybe
at com.sun.corba.ee.impl.logging.ORBUtilSystemException.couldNotFindClass(ORBUtilSystemException.java:8309)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:984)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:850)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_abstract_interface(CDRInputStream_1_0.java:844)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_abstract_interface(CDRInputStream_1_0.java:834)
at com.sun.corba.ee.impl.encoding.CDRInputStream.read_abstract_interface(CDRInputStream.java:275)
at com.sun.corba.ee.impl.io.IIOPInputStream.readObjectDelegate(IIOPInputStream.java:361)
at com.sun.corba.ee.impl.io.IIOPInputStream.readObjectOverride(IIOPInputStream.java:524)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:345)
at java.util.HashMap.readObject(HashMap.java:1029)
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:597)
at com.sun.corba.ee.impl.io.IIOPInputStream.invokeObjectReader(IIOPInputStream.java:1692)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStream.java:1210)
at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:398)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:329)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:295)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1005)
at com.sun.corba.ee.impl.encoding.CDRInputStream.read_value(CDRInputStream.java:259)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:1987)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:2211)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStream.java:1219)
at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:398)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:329)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:295)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1005)
at com.sun.corba.ee.impl.encoding.CDRInputStream.read_value(CDRInputStream.java:259)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:1987)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:2211)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStream.java:1219)
at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:398)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:329)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:295)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1005)
at com.sun.corba.ee.impl.encoding.CDRInputStream.read_value(CDRInputStream.java:259)
at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl$14.read(DynamicMethodMarshallerImpl.java:333)
at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.readArguments(DynamicMethodMarshallerImpl.java:393)
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:119)
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:650)
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:193)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1705)
at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:154)
at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:194)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:159)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:119)
at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:197)
at be.macharis.toon.pacita.common.__OriginFacadeRemote_Remote_DynamicStub.setOrigin(__OriginFacadeRemote_Remote_DynamicStub.java)
at be.macharis.toon.pacita.common._OriginFacadeRemote_Wrapper.setOrigin(be.macharis.toon.pacita.common._OriginFacadeRemote_Wrapper.java)
at pacita.servlets.ContainerRegistry.processRequest(ContainerRegistry.java:64)
at pacita.servlets.ContainerRegistry.doGet(ContainerRegistry.java:95)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:397)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:278)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:536)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:179)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:73)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:182)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)
at com.sun.enterprise.web.VirtualServerPipeline.invoke(VirtualServerPipeline.java:120)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:939)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:137)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:536)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:939)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:239)
at com.sun.enterprise.web.connector.grizzly.ProcessorTask.invokeAdapter(ProcessorTask.java:667)
at com.sun.enterprise.web.connector.grizzly.ProcessorTask.processNonBlocked(ProcessorTask.java:574)
at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:844)
at com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:287)
at com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:212)
at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)
at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:75)
Caused by: java.lang.ClassNotFoundException
... 77 more
-END server-side stack trace- vmcid: SUN minor code: 257 completed: Maybe
# 2
Are componentRegistryandOriginFacadeRemote.ELEMENT_CONTAINERare serializable? Looks like the ORB is trying to marshall it and is running into issues. I have forwarded this to the ORB team. Stay tuned for reply.
# 3
componentRegistry is a detached entity and OriginFacadeRemote.ELEMENT_CONTAINER is a static final int.
I changed the second argument to Integer instead of int and I also added the toplink libraries as suggested on http://forum.java.sun.com/thread.jspa?threadID=761424 but neither of it worked.
If I find a bug in my code or if I find a work around I will let it know
# 4
Hello, I haven't found a solution yet, but the problem in my case is indeed with the arguments and more specifically the use of entities as arguments for session beans.
As I understand from the EJB specification the idea behind entities is that they would provide lightweight persistence and could be used as POJOs. Apparently their use as POJOs has some restrictions in the current EJB container implementation. I suppose this is a bug.
A search over the Internet shows that there appears to be a related issue for entities with relationships that are lazily fetched. My entity has no relationships, so the issue is not limited to lazy fetching.
I am still looking if I can find a quick fix, because I want to avoid having to rewrite my code (which worked so far).
# 5
I think I found my bug. My entity is a container for objects of other classes. I have two projects, an EJB project and a WAR project. The WAR project includes the EJB classes but not the other way round. I had defined the classes in my WAR project and evidently, the EJB session bean didn't know about them. The solution was to move the classes I use in the container from the WAR project to the EJB project.
I have another bug now, somehow I can't access a session bean from a custom tag. However, that is not the topic of this thread.
To come back to the question in the first post,
There might be an error here:
public int createCustomer(Customer c) {
em.persist(c);
return c.getId();
}
I suppose you use for the annotation of the primary key something as:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
When I tried this, the primary key value in the database would increment, but not in the live object I would use. The value of id in the object would remain 0. Therefore, I decided to externally set the primary key value.
However this would not cause the error message you have. As I came to understand, I think the error message has to do with the arguments or return value for the session bean, thus in
Customer c2 = agent.findCustomer(pk);// this causes the ERROR
Are you sure that the class Customer is in the EJB project?
If it is so, are you using lazy fetching for the one to many relationships? I found that several people had encountered the same error message with lazy fetching and it was solved when they set the fetching to eager.
Good luck solving your bug
# 6
Is this discussion helpful: http://forum.java.sun.com/thread.jspa?threadID=761424Graham Robbinsbawtry.net