Jsf 2 未在托管Bean中序列化EJB
我的应用服务器是WebSphereApplicationServerV8。我有一个会话范围的托管bean,在其中我使用@EJB注释注入了EJB(EJB3.0)。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
@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);