2013-09-23 22 views
6

Czy powinienem zadeklarować zmienne wstrzykiwane jako transient w Java EE?Czy powinienem zadeklarować wstrzykiwane zmienne jako przejściowe w Java EE?

Dostaję ostrzeżenie FindBugs:

Klasa com.playaround.HelloServlet określa zakaz przejściowy zakaz serializacji instancji pola accelerationUnit
Ten Serializable klasa definiuje zakaz prymitywny instancji pole, które nie jest ani przemijający, Serializable lub java.lang.Object i nie wydaje się implementować interfejsu Externalizable lub metody readObject() i writeObject().
Obiekty tej klasy nie zostaną prawidłowo sformatowane, jeśli w tym polu przechowywany jest obiekt inny niż Serializowalny.

Kod w grze jest:

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

samo pytanie dotyczy @Resource, @Inject, @PersistenceUnit itp

Odpowiedz

7

To zależy;) Z @Inject i innymi adnotacjami CDI należy sprawdzić rozdział 6.6 z JSR-299 specification. Masz tam informację, które ziarna są "zdolne do pasywacji".

O bezpaństwowców i pojedynczych ziaren sesyjnych, zgodnie ze specyfikacją EJB, nie mogą być w odcinkach (jak EJB pasywacja nie występuje)

Ostatni myśleć i najbardziej problematyczne jest stanowe fasoli sesji. Wszystkie zasoby JavaEE (EJB, InitialContext, SessionContext itd.) Zostaną przywrócone po aktywacji, ale musisz zająć się innymi nie-serializującymi polami i otwartymi połączeniami. Dlatego w twoim przypadku IMHO powinieneś oznaczyć AccelerationUnit jako przejściowy i przywrócić w zdarzeniu ejbActivate lub włączyć CDI i metody producenta do automatyzacji wtrysku.

+0

Należy ponownie edytować pytanie, aby ograniczyć go do AT WebServiceRef tylko dlatego, że nad tym pracowałem. Zauważyłem jednak, że mam ten sam problem, jeśli wstrzyknięto AT PersistenceUnit i AT EJB do serwletu, więc pomyślałem, że można go rozszerzyć. –

-3

W definicji klasy AccelerationUnit, sprawiają, że podoba:

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

AccelerationUnit jest klasą webserviceclient, która nie jest serializowalna. Zostało to podane jako przykład. –