2013-09-23 15 views
6

Devo dichiarare le variabili iniettate come transient in Java EE?Devo dichiarare le variabili iniettate come transitori in Java EE?

sto ottenendo un avvertimento FindBugs:

Classe com.playaround.HelloServlet definisce non serializzabile campo di istanza accelerationUnit
Questa classe Serializable non transitorio definisce un campo di un'istanza non primitiva che non è né transitoria, Serializable, o java.lang.Object, e non sembra implementare l'interfaccia Externalizable oi metodi readObject() e writeObject().
Gli oggetti di questa classe non verranno deserializzati correttamente se in questo campo è archiviato un oggetto non serializzabile.

Il codice in gioco è:

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

Stessa domanda vale per @Resource, @Inject, @PersistenceUnit ecc

risposta

7

Dipende;) Con @Inject e altre annotazioni CDI è necessario consultare il capitolo 6.6 di JSR-299 specification. Ci sono informazioni che i fagioli sono "passivabili".

Chi bean di sessione senza stato e Singleton, secondo la specifica EJB, non può essere serializzato (come EJB passivazione non si verifica)

Ultima pensare e più problematico è session bean stateful. Tutte le risorse JavaEE (EJB, InitialContext, SessionContext ecc.) Verranno ripristinate dopo l'attivazione, ma dovrai occuparti di altri campi non serializzabili e delle connessioni aperte. Quindi nel tuo caso IMHO dovresti contrassegnare accelerationUnit come transitorio e ripristinare in evento ejbActivate, o coinvolgere CDI e metodi produttore per iniettare il campo automaticamente.

+0

Dovrei ri-modificare la domanda per limitarla a AT WebServiceRef solo perché era quello su cui stavo lavorando. Tuttavia, ho notato che ho lo stesso problema se iniettavo un AT PersistenceUnit e AT EJB in un servlet, quindi ho pensato che potesse essere espanso. –

-3

Nella definizione della classe AccelerationUnit, renderlo come:

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

AccelerationUnit è un client Webservic non una classe serializzabile. È stato dato come esempio. –

Problemi correlati