Сеансовый компонент с сохранением состояния, возвращающий объекты

#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. все коллекции сериализуемы, это не проблема