8

transient我应该像在 Java EE 中那样声明注入变量吗?

我收到了 FindBugs 警告:

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

游戏中的代码是:

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

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

4

2 回答 2

7

这取决于 ;) 使用 @Inject 和其他 CDI 注释,您应该查看JSR-299 规范的第 6.6 章。您已经获得了哪些 bean 具有“钝化能力”的信息。

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

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

于 2013-09-23T22:05:31.040 回答
-3

在类AccelerationUnit的定义中,使其如下:

class AccelerationUnit implements Serializable{
    // your code here
  }
于 2013-09-23T15:32:19.250 回答