我应该在Java EE中将注入的变量声明为瞬态吗?

时间:2013-09-23 14:48:12

标签: java-ee serialization transient

我应该在Java EE中将注入的变量声明为transient吗?

我收到一个FindBugs警告:

  

类com.playaround.HelloServlet定义非瞬态非可序列化实例字段accelerationUnit
  此Serializable类定义非原始实例字段,该字段既不是瞬态,也不是Serializable或java.lang.Object,并且似乎不实现Externalizable接口或readObject()和writeObject()方法。
  如果在此字段中存储非Serializable对象,则不会正确反序列化此类的对象。   

游戏中的代码是:

/**
 * Sample of a web service reference.
 */
@WebServiceRef
private AccelerationUnit accelerationUnit;

同样的问题适用于@Resource@Inject@PersistenceUnit等。

2 个答案:

答案 0 :(得分:7)

取决于;)使用@Inject和其他CDI注释,您应该查看JSR-299 specification的第6.6章。你已经掌握了哪些豆类具有“钝化能力”的信息。

关于无状态和单例会话bean,根据EJB规范,它们不能被序列化(因为不会发生ejb钝化)

最后认为,最有问题的是有状态会话bean。激活后将恢复所有JavaEE资源(EJB,InitialContext,SessionContext等),但您必须处理其他非可序列化字段并打开连接。因此,在您的情况下,您应该将accelerationUnit标记为瞬态并在ejbActivate事件中恢复,或者让CDI和生产者方法自动注入字段。

答案 1 :(得分:-3)

在类 AccelerationUnit 的定义中,使其像:

class AccelerationUnit implements Serializable{
    // your code here
  }