2013-05-21 5 views
6

Sto utilizzando Jersey JAX-RS con Jackson (per serializzazione/deserializzazione) per implementare un set di servizi REST. Quando un chiamante esegue un'operazione di aggiornamento (ad esempio un PUT), in genere ho seguito la convenzione che i campi nulli inviati nella richiesta vengono ignorati quando la destinazione viene aggiornata. Solo i campi che sono stati impostati su un valore effettivo vengono aggiornati.Quando si utilizza Jersey JAX-RS, esiste un modo per distinguere tra i campi inviati come nulli ei campi non inviati affatto?

Tuttavia, preferirei se potessi distinguere tra i campi inviati come campi nulli vs che non sono stati inviati affatto, quindi so di cancellare campi che sono stati inviati esplicitamente come null.

Posso inventare un modo per farlo, ma mi chiedo se c'è qualcosa disponibile nel framework. Sembra un requisito comune.

risposta

2

Se si utilizza il supporto di JSON POJO (parametro init com.sun.jersey.api.json.POJOMappingFeature a true in web.config), allora una soluzione semplice è quella di avere "un setter intelligente" sul tuo POJO:

class MyBean { 
    private String foo; 
    private String bar; 
    private boolean fooSet; 

    public String getFoo() { 
     return this.foo; 
    } 

    public void setFoo(String foo) { 
     this.foo = foo; 
     this.fooSet = true; 
    } 

    public String getBar() { 
     return this.bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 

    public boolean isFooSet() { 
     return this.fooSet; 
    } 
} 

The Jackson chiamerà il setter se il campo è presente (indipendentemente dal valore) e lo ignorerà se il campo è completamente mancante.

Per JAXB Based JSON support non so se il setter sarà mai chiamato quindi potrebbe essere necessario scrivere personalizzato MessageBodyReader/s MessageBodyWriter o una forma specializzata di JSONJAXBContext.