我应该在 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 中将注入的变量声明为瞬态吗?的主要内容,如果未能解决你的问题,请参考以下文章

将 Dbcontext 配置为瞬态

非瞬态类成员的 Java PMD 警告

在 JPA 中是不是可以将继承的属性重新定义为瞬态?

php 显示保存为瞬态的导航菜单的功能

dotnet 核心中的 Dbcontext 对象瞬态

为啥可以在java的抽象类中声明瞬态变量? [复制]