Jakarta ee 我应该在JavaEE中将注入的变量声明为瞬态变量吗?

Jakarta ee 我应该在JavaEE中将注入的变量声明为瞬态变量吗?,jakarta-ee,serialization,transient,Jakarta Ee,Serialization,Transient,我应该在JavaEE中将注入的变量声明为transient 我收到FindBugs警告: 类com.playaround.HelloServlet定义了非瞬态非序列化实例字段accelerationUnit 此可序列化类定义了一个非基本实例字段,该字段既不是暂时的、可序列化的,也不是java.lang.Object,并且似乎没有实现外部化接口或readObject()和writeObject()方法。 如果此字段中存储了不可序列化的对象,则此类的对象将无法正确反序列化。 其中的代码是: /**

我应该在JavaEE中将注入的变量声明为
transient

我收到FindBugs警告:

类com.playaround.HelloServlet定义了非瞬态非序列化实例字段accelerationUnit
此可序列化类定义了一个非基本实例字段,该字段既不是暂时的、可序列化的,也不是java.lang.Object,并且似乎没有实现外部化接口或readObject()和writeObject()方法。
如果此字段中存储了不可序列化的对象,则此类的对象将无法正确反序列化。

其中的代码是:

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

同样的问题也适用于
@Resource
@Inject
@PersistenceUnit
等。在类AccelerationUnit的定义中,将其设置为:

class AccelerationUnit implements Serializable{
    // your code here
  }
视情况而定;)对于@Inject和其他CDI注释,您应该查看的第6.6章。您已经获得了哪些bean具有“钝化能力”的信息

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


最后,也是最有问题的是有状态会话bean。所有JavaEE资源(EJB、InitialContext、SessionContext等)都将在激活后恢复,但您必须处理其他不可序列化的字段和打开的连接。因此,在您的情况下,IMHO应该将accelerationUnit标记为transient并在ejbActivate事件中还原,或者使用CDI和producer方法自动注入字段。

accelerationUnit是webserviceclient,而不是可序列化的类。这是作为一个例子给出的。我应该重新编辑这个问题,将其限制在WebServiceRef,因为这是我正在研究的。然而,我确实注意到,如果我在servlet中注入一个AT PersistenceUnit和AT EJB,那么我也会遇到同样的问题,因此我认为它可以扩展。