【问题标题】:Stateful session bean, return objects有状态会话 bean,返回对象
【发布时间】:2011-08-14 00:01:17
【问题描述】:

我在 glassfish 上部署了一个有状态会话 bean,并且有一个名为 getCars 的方法,它返回 Car 类的对象集合。 Car 类在 bean 项目和客户端项目中定义(实际上是同一个类)。我有一个客户端(不是应用程序客户端),在其中我获得了对 bean 远程接口的引用,如here 所述。但是我的客户遇到了这样的例外情况

线程“主”javax.ejb.EJBException 中的异常:java.rmi.MarshalException:CORBA BAD_PARAM 1330446342 也许;嵌套异常是: java.io.NotSerializableException: ----------BEGIN 服务器端堆栈跟踪---------- org.omg.CORBA.BAD_PARAM:vmcid:OMG 次要代码:6 完成:也许 在 com.sun.corba.ee.impl.logging.OMGSystemException.notSerializable(OMGSystemException.java:990) 在 com.sun.corba.ee.impl.logging.OMGSystemException.notSerializable(OMGSystemException.java:1005) 在 com.sun.corba.ee.impl.orbutil.ORBUtility.throwNotSerializableForCorba(ORBUtility.java:753) 在 com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_abstract_interface(CDROutputStream_1_0.java:765) 在 com.sun.corba.ee.impl.encoding.CDROutputObject.write_abstract_interface(CDROutputObject.java:709) 在 com.sun.corba.ee.impl.javax.rmi.CORBA.Util.writeAbstractObject(Util.java:501) 在 com.sun.corba.ee.impl.io.IIOPOutputStream.writeObjectOverride(IIOPOutputStream.java:197) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) 在 java.util.ArrayList.writeObject(ArrayList.java:570) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 com.sun.corba.ee.impl.io.IIOPOutputStream.invokeObjectWriter(IIOPOutputStream.java:760) 在 com.sun.corba.ee.impl.io.IIOPOutputStream.outputObject(IIOPOutputStream.java:716) 在 com.sun.corba.ee.impl.io.IIOPOutputStream.simpleWriteObject(IIOPOutputStream.java:227) 在 com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueInternal(ValueHandlerImpl.java:268) 在 com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueWithVersion(ValueHandlerImpl.java:240) 在 com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValue(ValueHandlerImpl.java:193) 在 com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.callWriteValue(CDROutputStream_1_0.java:932) 在 com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.writeRMIIIOPValueType(CDROutputStream_1_0.java:917) 在 com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:1044) 在 com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:1057) 在 com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:774) 在 com.sun.corba.ee.impl.encoding.CDROutputObject.write_value(CDROutputObject.java:681) 在 com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl $14.write(DynamicMethodMarshallerImpl.java:394) 在 com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.writeResult(DynamicMethodMarshallerImpl.java:490) 在 com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:180) 在 com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:682) 在 com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:216) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1841) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1695) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1078) 在 com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:221) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:797) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:561) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2558) 在 com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:492) 在 com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:528)

我认为问题在于 Car 类的对象的编组。对象编组如何解决这个问题?

【问题讨论】:

    标签: java jakarta-ee ejb-3.0


    【解决方案1】:

    Car 类必须实现 java.io.Serializable 以便它可以被序列化并“通过网络”传输。 Reference: Java serialization

    还要确保Car 类的所有字段都是可序列化的类型。例如Car 可能有一个private Engine engine 字段。 Engine 也必须是可序列化的。 (或者如果在序列化过程中被忽略,则标记为transient

    【讨论】:

    • 我已经把它序列化了,但它又抛出了这个异常。
    • 不,Car 类有 2 个 int 属性、1 个 String 属性和 1 个 java.sql.Date 属性。它们都是可序列化的
    • 然后确保您已成功重新部署新版本。
    • 嗯,如果我的方法签名具有返回类型 Collection(Collection 不可序列化),但在方法 getCars 我创建 ArrayList 并返回它。会不会造成这样的问题?
    • 所有集合都是可序列化的,这不是问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多