我应该在 Java EE 中将注入的变量声明为瞬态吗?
Posted
技术标签:
【中文标题】我应该在 Java EE 中将注入的变量声明为瞬态吗?【英文标题】:Should I declare injected variables as transient in Java EE? 【发布时间】:2013-09-28 12:46:43 【问题描述】:我应该在 Java EE 中将注入变量声明为 transient
吗?
我收到了 FindBugs 警告:
com.playaround.HelloServlet 类定义了非瞬态不可序列化的实例字段加速单元 这个 Serializable 类定义了一个非原始实例字段,它既不是瞬态的、Serializable 也不是 java.lang.Object,并且似乎没有实现 Externalizable 接口或 readObject() 和 writeObject() 方法。 如果此字段中存储了不可序列化的对象,则此类的对象将无法正确反序列化。
正在播放的代码是:
/**
* Sample of a web service reference.
*/
@WebServiceRef
private AccelerationUnit accelerationUnit;
同样的问题适用于@Resource
、@Inject
、@PersistenceUnit
等。
【问题讨论】:
【参考方案1】:这取决于 ;) 对于 @Inject 和其他 CDI 注释,您应该查看 JSR-299 specification 的第 6.6 章。您已经获得了哪些 bean 具有“钝化能力”的信息。
关于无状态和单例会话bean,根据EJB规范,它们不能被序列化(因为不会发生ejb钝化)
最后考虑和最成问题的是有状态会话 bean。所有 JavaEE 资源(EJB、InitialContext、SessionContext 等)将在激活后恢复,但您必须注意其他不可序列化的字段和打开的连接。因此,在您的情况下,恕我直言,您应该将 accelerationUnit 标记为瞬态并在 ejbActivate 事件中恢复,或者涉及 CDI 和生产者方法以自动注入字段。
【讨论】:
我应该重新编辑问题以将其限制为仅 AT WebServiceRef,因为那是我正在处理的问题。但是,我确实注意到如果我在 servlet 中注入 AT PersistenceUnit 和 AT EJB 也会遇到同样的问题,所以我认为它可以扩展。【参考方案2】:在类AccelerationUnit的定义中,使其如下:
class AccelerationUnit implements Serializable
// your code here
【讨论】:
AccelerationUnit 是一个 webserviceclient 不是一个可序列化的类。举个例子吧。以上是关于我应该在 Java EE 中将注入的变量声明为瞬态吗?的主要内容,如果未能解决你的问题,请参考以下文章