Jsf 2 未在托管Bean中序列化EJB

Jsf 2 未在托管Bean中序列化EJB,jsf-2,websphere,ejb-3.0,Jsf 2,Websphere,Ejb 3.0,我的应用服务器是WebSphereApplicationServerV8。我有一个会话范围的托管bean,在其中我使用@EJB注释注入了EJB(EJB3.0)。EJB是无状态的 @ManagedBean @SessionScoped public class MyBean extends BaseBackingBean implements Serializable { @EJB private IDetails custInfo; 我在分析会话数据时注意到Not

我的应用服务器是WebSphereApplicationServerV8。我有一个会话范围的托管bean,在其中我使用@EJB注释注入了EJB(EJB3.0)。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;
这是正确的实施方案还是替代方案


我已经提到,不需要将EJB标记为瞬态;那么有什么问题吗?

在WAS V8上实现了一个POC代码,具有本地和远程接口,注意如下:

a。使用本地接口(EJB不实现可序列化)

这导致java.io.NotSerializableException:com.ibm.test.SerializableTestEJB 在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:。。 为了防止这种情况,EJB必须显式地实现Serializable

b.具有远程接口(EJB不实现可序列化)

序列化已成功完成

结论:

远程接口的固有机制是获取存根或代理,以允许使用此代理模式进行客户机-服务器通信。这涉及数据的编组和解编组,因此默认情况下代理存根是可序列化的,因此EJB不需要实现可序列化接口

但是本地接口不涉及远程查找和存根处理程序。EJB初始化类似于初始化本地可用类,因此默认情况下序列化不可用。在这种情况下,EJB需要实现可序列化接口,或者需要声明对象为瞬态以跳过序列化。


我将变量声明为瞬态。这可能是WebSphere特定的解决方案

您使用的是什么容器?EJB方法返回类型和参数是否可序列化。@NayanWadekar:Huh?这到底是如何导致该问题的?@BaluC:使用WebSphere Application Server V8。@NayanWadekar:我们需要将EJB bean标记为可序列化吗?我知道VE2方法一个将字符串作为输入并返回LinkedHashMap,另一个字符串作为输入并将字符串作为输出
// 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);
//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);