jakarta-ee - 我应该在 Java EE 中将注入(inject)的变量声明为 transient 吗?

标签 jakarta-ee serialization transient

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

我收到了 FindBugs 警告:

Class com.playaround.HelloServlet defines non-transient non-serializable instance field accelerationUnit
This Serializable class defines a non-primitive instance field which is neither transient, Serializable, or java.lang.Object, and does not appear to implement the Externalizable interface or the readObject() and writeObject() methods.
Objects of this class will not be deserialized correctly if a non-Serializable object is stored in this field.



游戏中的代码是:
/**
 * Sample of a web service reference.
 */
@WebServiceRef
private AccelerationUnit accelerationUnit;

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

最佳答案

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

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

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

关于jakarta-ee - 我应该在 Java EE 中将注入(inject)的变量声明为 transient 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18962352/

相关文章:

iphone - 在 Core Data 中 transient 属性的 getter 中执行密集型任务

jakarta-ee - Java EE 6 @Startup 和 @Schedule 永远不会被执行

java - 在 Java EE 服务器中存储企业应用程序的状态(例如用于 lucene 索引)

.net - 如何序列化指向被覆盖的虚拟方法基础的委托(delegate)?

java - 我需要在未映射的父类(super class)属性上使用 @Transient 注释吗?

asp.net-core - 何时使用以下 transient 、作用域和单例

apache - 缺少 Solr solconfig.xml

java - Java EE 中的抽象类和 Servlet

WPF:如何将数据从另一个域编码到用户控件

arrays - 如何从 Swift 3 中的结构数组生成 JSON?