2012-06-29 5 views
1

Мой сервер приложений - это WebSphere Application Server V8. У меня есть обработанный сеансом управляемый bean-компонент, в который я ввел EJB (EJB 3.0) с помощью аннотации @EJB. EJB не имеет гражданства.EJB не сериализуется в управляемом компоненте

@ManagedBean 
    @SessionScoped 
    public class MyBean extends BaseBackingBean implements 
    Serializable { 

@EJB 
private IDetails custInfo; 

Я анализировал данные сессии и заметил NotSerializableException

java.io.NotSerializableException: com.ejb.EJSLocal0SLDetailsImpl_081f812d at 
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) at 
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1537) at 
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1502) at 
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1420) at 
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) at 

Теперь я попытался отметить EJB как преходящие и она отлично работает без бросания исключения NotSerializableException.

@EJB 
private transient IDetails custInfo; 

Это правильная реализация или альтернативное решение?

Я упомянул Should EJBs be instance variables and marked as transient in JSF Managed Beans?, где указано, что маркировка EJB в качестве переходного процесса не требуется; то что может быть не так?

+0

Какой контейнер вы используете? – BalusC

+0

Являются ли методы EJB возвращаемыми типами и аргументами сериализуемыми. –

+0

@NayanWadekar: А? Как именно это может вызвать эту проблему? – BalusC

ответ

3

Реализована код СПЭ на WAS V8 с локальными и удаленными интерфейсами, отметил следующее:

а. С локального интерфейса (EJB не реализует Serializable)

// Initializing the EJB in the servlet 
SerializableTestEJBLocal localSrvlt=new SerializableTestEJB(); 
//Try to serialize 
FileOutputStream objFOS = new FileOutputStream("D:\\MYTEST\\testsrv.txt"); 
ObjectOutputStream objOpStr = new ObjectOutputStream(objFOS); 
objOpStr.writeObject(localSrvlt); 

Это привело к java.io.NotSerializableException: com.ibm.test.SerializableTestEJB на java.io.ObjectOutputStream.writeObject0 (ObjectOutputStream.java :. . чтобы предотвратить это, EJB пришлось явно реализовать Serializable.

б. с помощью удаленного интерфейса (EJB не реализует сериализации)

//Obtain Remote Stub. 
SerializableTestEJBRemote seremoteSrvlt=(SerializableTestEJBRemote)PortableRemoteObject.narrow(homeObject, SerializableTestEJBRemote.class); 

//Try serialization 
FileOutputStream objFOS = new FileOutputStream("D:\\MYTEST\\testsrv.txt"); 
ObjectOutputStream objOpStr = new ObjectOutputStream(objFOS); 
objOpStr.writeObject(seremoteSrvlt); 

Сериализация была успешно выполнена.

Вывод:

Присущая механизм удаленного интерфейса является получение заглушки или прокси-сервер, чтобы обеспечить клиент-сервер связи происходит с использованием этого шаблона прокси. Это включает в себя сбор и разбор данных, и, следовательно, прокси-заглушка является Serializable по умолчанию, и, следовательно, EJB не нужно реализовывать интерфейс Serializable.

Но локальные интерфейсы не связаны с удаленным поиском и обработчиками заглушек. Инициализация EJB аналогична инициализации локально доступного класса, поэтому сериализация по умолчанию недоступна. В этом случае либо EJB должен будет реализовать сериализуемый интерфейс, либо объект должен быть объявлен переходным процессом, чтобы пропустить сериализацию.

Я объявляю переменную как переходную. Это может быть специальное решение WebSphere

Смежные вопросы