我应该在Java EE中将注入的变量声明为transient
吗?
我收到一个FindBugs警告:
类com.playaround.HelloServlet定义非瞬态非可序列化实例字段accelerationUnit
此Serializable类定义非原始实例字段,该字段既不是瞬态,也不是Serializable或java.lang.Object,并且似乎不实现Externalizable接口或readObject()和writeObject()方法。
如果在此字段中存储非Serializable对象,则不会正确反序列化此类的对象。
游戏中的代码是:
/**
* Sample of a web service reference.
*/
@WebServiceRef
private AccelerationUnit accelerationUnit;
同样的问题适用于@Resource
,@Inject
,@PersistenceUnit
等。
答案 0 :(得分:7)
取决于;)使用@Inject和其他CDI注释,您应该查看JSR-299 specification的第6.6章。你已经掌握了哪些豆类具有“钝化能力”的信息。
关于无状态和单例会话bean,根据EJB规范,它们不能被序列化(因为不会发生ejb钝化)
最后认为,最有问题的是有状态会话bean。激活后将恢复所有JavaEE资源(EJB,InitialContext,SessionContext等),但您必须处理其他非可序列化字段并打开连接。因此,在您的情况下,您应该将accelerationUnit标记为瞬态并在ejbActivate事件中恢复,或者让CDI和生产者方法自动注入字段。
答案 1 :(得分:-3)
在类 AccelerationUnit 的定义中,使其像:
class AccelerationUnit implements Serializable{
// your code here
}