Question

Should I declare injected variables as transient in Java EE?

I am getting a FindBugs warning:

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.

The code in play is:

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

Same question applies to @Resource, @Inject, @PersistenceUnit etc.

Was it helpful?

Solution

It depends ;) With @Inject and other CDI annotations you should check chapter 6.6 of JSR-299 specification. You have got there information which beans are "passivation capable".

About stateless and singleton session beans, according to EJB specification, they cannot be serialized (as ejb passivation doesn't occur)

Last think and most problematic is stateful session beans. All JavaEE resources (EJB, InitialContext, SessionContext etc) will be restored after activation, but you have to take care of other non-serializable fields and open connections. So in your case IMHO you should mark accelerationUnit as transient and restore in ejbActivate event, or involve CDI and producer methods to inject field automagically.

OTHER TIPS

In the definition of the class AccelerationUnit, make it like:

class AccelerationUnit implements Serializable{
    // your code here
  }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top