【问题标题】:Should I declare injected variables as transient in Java EE?我应该在 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 等。

【问题讨论】:

    标签: jakarta-ee serialization transient


    【解决方案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 不是一个可序列化的类。举个例子吧。
    猜你喜欢
    • 2015-01-20
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多