#java #jakarta-ee #ejb-3.0
#java #джакарта-ee #ejb-3.0
Вопрос:
У меня есть сессионный компонент с сохранением состояния, развернутый на glassfish, и есть вызываемый метод, getCars
который возвращает коллекцию объектов Car
класса. Класс Car определен в проекте bean и в клиентском проекте (фактически это один и тот же класс). У меня есть клиент (не клиент приложения), в котором я получаю ссылку на удаленный интерфейс компонента, как описано здесь. Но мой клиент сталкивается с такими исключениями
Исключение в потоке "main" javax.ejb.EJBException: java.rmi.MarshalException: CORBA BAD_PARAM 1330446342 Возможно; вложенное исключение является: java.io.NotSerializableException: ---------- ЗАПУСК трассировки стека на стороне сервера---------- 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 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) в sun.reflect.Делегирование methodaccessorimpl.invoke(делегирование methodaccessorimpl.java:25) в java.lang.reflect.Метод.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. Как можно решить эту проблему с помощью сортировки объектов?
Ответ №1:
Car
Класс должен реализовываться java.io.Serializable
таким образом, чтобы его можно было сериализовать и передать «по проводам». Ссылка: сериализация Java
Также убедитесь, что все поля Car
класса имеют сериализуемые типы. Например, Car
может содержать private Engine engine
поле. Engine
также должен быть сериализуемым. (или отмечен transient
, если он должен игнорироваться во время сериализации)
Комментарии:
1. Я сделал его сериализуемым, но он снова выдает это исключение.
2. нет, класс Car имеет 2 attr из int, 1 из String и 1 из java.sql.Date. Все они сериализуемы
3. затем убедитесь, что вы успешно повторно внедрили новую версию.
4. Хммм, если сигнатура моего метода имеет возвращаемый тип Collection<Car> (Коллекция не сериализуема), но в методе getCars я создаю ArrayList<Car> и возвращаю его. Вызовет ли это такую проблему?
5. все коллекции сериализуемы, это не проблема