2013-09-23 26 views
6

如果我宣布注入变量中的Java EE transient我应该在Java EE中声明注入变量为瞬态吗?

我得到一个FindBugs的警告:

类com.playaround.HelloServlet定义的非暂时性非序列化的实例字段accelerationUnit
这Serializable类定义了一个非原始实例字段既不是短暂的, Serializable或java.lang.Object,并且不会实现Externalizable接口或readObject()和writeObject()方法。这个类的
对象将如果非序列化对象被存储在该字段不能被正确反序列化。

在游戏中的代码是:

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

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

回答

7

这取决于;)使用@Inject和其他CDI注释,您应该检查JSR-299 specification的第6.6章。你已经得到了哪些豆子是“钝化能力”的信息。

关于无国籍和辛格尔顿会话bean,根据EJB规范,它们不能被序列化(如EJB钝化不会发生)

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

+0

我应该重新编辑问题,仅限于AT WebServiceRef,因为那正是我正在处理的问题。但是,我注意到如果我在servlet中注入AT PersistenceUnit和AT EJB,我也有同样的问题,所以我认为它可以扩展。 –

-3

在类AccelerationUnit的定义,使它像:

class AccelerationUnit implements Serializable{ 
    // your code here 
    } 
+0

AccelerationUnit是WebServiceClient此类不是一个序列化类。这是作为一个例子。 –

相关问题