【发布时间】:2012-06-30 16:16:42
【问题描述】:
我的应用服务器是 WebSphere Application Server V8。我有一个会话范围的托管 bean,我使用 @EJB 注释在其中注入了 EJB (EJB 3.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;
这是正确的实现还是可以替代的解决方案?
我提到了Should EJBs be instance variables and marked as transient in JSF Managed Beans?,其中提到不需要将 EJB 标记为瞬态;那么有什么问题呢?
【问题讨论】:
-
你用的是什么容器?
-
EJB 方法的返回类型和参数是否可序列化。
-
@NayanWadekar:嗯?这究竟是如何导致这个问题的?
-
@BaluC:使用 WebSphere Application Server V8。
-
@NayanWadekar:我们需要将 EJB bean 标记为可序列化吗?我有 2 种方法,一个将字符串作为输入并返回 LinkedHashMap,另一个字符串作为输入,字符串作为输出