2010-11-18 12 views
6

Questa è la mia classe (JAX-RS annotati):Come insegnare a findbugs a capire correttamente i campi IoC?

@Path("/") 
public class Foo { 
    @Context 
    private UriInfo uriInfo; 
    // ... 
} 

Questo è ciò che findbugs dice:

Unwritten field: com.XXX.Foo.uriInfo 

E 'vero, il campo è non scritta, ma è iniettato da JAX-RS servlet . Penso che sto facendo qualcosa di sbagliato qui, ma come risolvere il problema?

+0

si potrebbe provare solo sopprimere l'avvertimento ... –

+0

@Donal Beh, naturalmente, Posso persino disabilitare la convalida del findbugs. Ma il punto non è disattivare la validazione, ma capire come scrivere codice sicuro e protetto. Findbugs e i suoi avvertimenti sono progettati per aiutare in questo, per quanto ho capito. Destra? – yegor256

+0

Ecco perché non l'ho fatto in una risposta. (Si potrebbe anche chiedere direttamente agli sviluppatori di Findbugs: l'annotazione '@ Context' viene mantenuta in fase di esecuzione e quindi può essere individuata dal proprio analizzatore.OTOH, quando le cose diventano complesse, ad es. Con Spring, è * ancora * meglio farlo in modo diverso che Findbugs non si arrabbi tanto.) –

risposta

3

Quello che ho capito finora è che findbugs ha ragione. Mi dice che questa variabile non è accessibile dall'esterno della classe e la mia annotazione non è valida in termini di OOP. Il servlet JAX-RS dovrà interrompere le restrizioni di accesso al campo per iniettare UriInfo. Devo dargli un modo legale per questo campo:

@Path("/") 
public class Foo { 
    private UriInfo uriInfo; 
    @Context 
    public void setUriInfo(UriInfo info) { 
    this.uriInfo = info; 
    } 
    // ... 
} 

Ora è corretto per findbugs e per la programmazione orientata agli oggetti paradigma di progettazione :)

+0

... e in che modo influisce sulla copertura del test? ;-) – Armand

+0

L'annotazione '@ Context' * funziona * in questo modo. –

+0

@Alison Ovviamente ho dovuto aggiungere un nuovo test per 'setUriInfo()' – yegor256

Problemi correlati