Spring REST Service: come configurare per rimuovere oggetti nulli nella risposta JSON

Ho un webservice di spring che restituisce una risposta JSON. Sto usando l’esempio fornito qui per creare il servizio: http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/

Il formato in cui viene restituito json è: {“nome”: null, “staffName”: [“kfc-kampar”, “smith”]}

Voglio rimuovere qualsiasi object nullo dalla risposta restituita in modo che assomigli a questo: {“staffName”: [“kfc-kampar”, “smith”]}

Ho trovato domande simili qui, ma sono riuscito a far funzionare una soluzione, ad es

Configurazione di ObjectMapper in spring

Come configurare MappingJacksonHttpMessageConverter mentre si utilizza la configurazione basata su annotazione di spring?

configurazione di jacksonObjectMapper che non funziona in spring mvc 3

come configurare spring mvc 3 per non restituire l’object “null” nella risposta JSON?

Spring configura il formato @ResponseBody JSON

Jackson + Spring3.0.5 mappatore di oggetti personalizzati

Dalla lettura attraverso queste e altre fonti, ho pensato che il modo più pulito per ottenere ciò che volevo era usare Spring 3.1 e i convertitori di messaggi che possono essere configurati all’interno dell’annotazione mvc. Il mio file di configurazione Spring aggiornato è:

               

La class di servizio è la stessa fornita sul sito mkyong.com, tranne che ho commentato l’impostazione della variabile Nome negozio in modo che sia nulla

 @Controller @RequestMapping("/kfc/brands") public class JSONController { @RequestMapping(value="{name}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody Shop getShopInJSON(@PathVariable String name) { Shop shop = new Shop(); //shop.setName(name); shop.setStaffName(new String[]{name, "cronin"}); return shop; } } 

I vasi Jackson che sto usando sono jackson-mapper-asl 1.9.0 e jackson-core-asl 1.9.0. Questi sono gli unici nuovi vasetti che ho aggiunto al pom fornito come parte del progetto spring-json che ho scaricato da mkyong.com.

Il progetto si costruisce con successo, ma quando invoco il servizio tramite il browser ottengo sempre la stessa cosa vale {“name”: null, “staffName”: [“kfc-kampar”, “smith”]}

Qualcuno può dirmi dove sto andando male con la mia configurazione?

Ho provato diverse altre opzioni, ma l’unico modo in cui sono stato in grado di restituire il json nel formato corretto è quello di aggiungere il programma di mapping degli oggetti a JSONController e il metodo “getShopInJSON” restituire una stringa, ad es.

 public @ResponseBody String getShopInJSON(@PathVariable String name) throws JsonGenerationException, JsonMappingException, IOException { ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL); Shop shop = new Shop(); //shop.setName(name); shop.setStaffName(new String[]{name, "cronin"}); String test = mapper.writeValueAsString(shop); return test; } 

Ora se invoco il servizio ottengo il previsto ie {“staffName”: [“kfc-kampar”, “cronin”]}

Sono anche riuscito a farlo funzionare usando l’annotazione @JsonIgnore, ma questa soluzione non è adatta a me.

Non capisco perché funzioni in codice ma non nella configurazione, quindi qualsiasi aiuto sarebbe fantastico.

Da quando Jackson 2.0 puoi usare JsonInclude

 @JsonInclude(Include.NON_NULL) public class Shop { //... } 

Dal momento che Jackson viene utilizzato, è necessario configurarlo come proprietà di Jackson. In caso di servizi REST di Spring Boot, è necessario configurarlo in application.properties :

 spring.jackson.default-property-inclusion=NON_NULL 

fonte

Se utilizzi Jackson 2, il tag dei convertitori di messaggi è:

              

A partire da Jackson 2.0, @JsonSerialize(include = xxx) è stato deprecato a favore di @JsonInclude

Per tutti voi non-xml di configurazione:

 ObjectMapper objMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL); HttpMessageConverter msgConverter = new MappingJackson2HttpMessageConverter(objMapper); restTemplate.setMessageConverters(Collections.singletonList(msgConverter)); 
 @JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY) public class Shop { //... } 

per Jackson 2.0 o versioni successive usa @JsonInclude(Include.NON_NULL)

Questo rimuoverà sia oggetti vuoti che null.

Dalla versione 1.6 abbiamo una nuova annotazione JsonSerialize (nella versione 1.9.9 per esempio).

Esempio:

 @JsonSerialize(include=Inclusion.NON_NULL) public class Test{ ... } 

Il valore predefinito è SEMPRE.

Nelle vecchie versioni è ansible utilizzare JsonWriteNullProperties, che è deprecato nelle nuove versioni. Esempio:

 @JsonWriteNullProperties(false) public class Test{ ... } 

Ho trovato una soluzione attraverso la configurazione del contenitore Spring, ma non è ancora esattamente quello che volevo.

Sono tornato a Spring 3.0.5, rimosso e al suo posto ho cambiato il mio file di configurazione in:

                  NON_NULL    

Questo è ovviamente simile alle risposte fornite in altre domande, ad es

configurazione di jacksonObjectMapper che non funziona in spring mvc 3

La cosa importante da notare è che mvc: annotation-driven e AnnotationMethodHandlerAdapter non possono essere utilizzati nello stesso contesto.

Non riesco ancora a farlo funzionare con Spring 3.1 e mvc: tuttavia, guidato da annotazioni. Una soluzione che utilizza mvc: basata sull’annotazione e tutti i benefici che l’accompagnano sarebbe molto meglio penso. Se qualcuno potesse mostrarmi come farlo, sarebbe fantastico.

È ansible utilizzare JsonWriteNullProperties per le versioni precedenti di Jackson.

Per Jackson 1.9+, usa JsonSerialize.include .