Frühlings-REST-Dienst: wie konfiguriert zum entfernen von null-Objekten in json-Antwort
Ich habe eine spring webservice, gibt eine json-Antwort. Ich bin mit dem hier aufgeführten Beispiel erstellen den Dienst:
http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/
Format json zurückgegeben wird:
{"name":null,"staffName":["kfc-kampar","smith"]}
Möchte ich entfernen Sie alle null-Objekte aus der Antwort zurückgegeben, so dass es wie folgt aussieht:
{"staffName":["kfc-kampar","smith"]}
Ich gefunden habe ähnliche Fragen hier, aber ich habe in der Lage, eine Lösung z.B.
Konfigurieren ObjectMapper im Frühjahr
konfigurieren der jacksonObjectMapper nicht in spring mvc 3
wie zu konfigurieren, spring mvc 3, um nicht wieder von "null" - Objekt in json-response?
Frühjahr konfigurieren @ResponseBody JSON-format
Jackson+Spring3.0.5 benutzerdefinierte Objekt-mapper
Lesen durch diese und andere Quellen, ich dachte mir der sauberste Weg zu erreichen, was ich wollte, war der Einsatz von Spring 3.1 und die Nachricht-Wandler, die konfiguriert werden können, die innerhalb der mvc-annotation.
Meine aktuelle spring config-Datei:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<context:component-scan base-package="com.mkyong.common.controller" />
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="prefixJson" value="true" />
<property name="supportedMediaTypes" value="application/json" />
<property name="objectMapper">
<bean class="org.codehaus.jackson.map.ObjectMapper">
<property name="serializationInclusion" value="NON_NULL"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
In der service-Klasse ist die gleiche wie auf dem mkyong.com Website, es sei denn, ich auskommentiert die Einstellung der Shop-name variable, so es ist null, d.h.
@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;
}
}
Jackson Gläser, die ich verwende, sind jackson-mapper-asl 1.9.0 und jackson-core-asl-1.9.0. Diese sind nur neue Gläser, die ich Hinzugefügt habe, um die pom als Teil der Feder-json-Projekt, das ich heruntergeladen mkyong.com.
Das Projekt erfolgreich erstellt, aber wenn ich den Dienst aufrufen über den browser ich bekomme immer noch die gleiche, D. H.
{"name":null,"staffName":["kfc-kampar","smith"]}
Kann mir jemand sagen, wohin ich gehe falsch mit meiner Konfiguration?
Ich habe versucht, mehrere andere Optionen, aber der einzige Weg, ich habe zurückkehren können, die json das richtige format ist, um die Objekt-mapper JSONController und haben die "getShopInJSON" - Methode gibt einen string zurück, d.h.
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;
}
Nun, wenn ich den Dienst aufzurufen, bekomme ich die erwarteten d.h.
{"staffName":["kfc-kampar","cronin"]}
Habe ich auch in der Lage gewesen, um es zu bekommen, um die Arbeit mit der @JsonIgnore Anmerkung, aber diese Lösung ist nicht geeignet für mich.
Ich verstehe nicht, warum es funktioniert, im code aber nicht in der Konfiguration, so dass jede Hilfe wäre fantastisch.
setSerializationInclusion()
Methode für die mapper-Objekt im xml-Format definiertYa das ist, wie ich es verstehe, auch. Die Objekt-mapper scheint richtig konfiguriert, es ist einfach nicht in der spring-container.
InformationsquelleAutor mikec | 2012-10-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Jackson 2.0 Sie können JsonInclude
InformationsquelleAutor Walery Strauch
Da Jackson verwendet wird, müssen Sie so konfigurieren, dass als Jackson-Eigenschaft. Im Fall von Spring Boot REST-Dienste, konfigurieren Sie es in
application.properties
oderapplication.yml
:Quelle
Die Eigenschaft name hat sich geändert, um
spring.jackson.default-property-inclusion=NON_NULL
. Funktioniert einwandfrei!InformationsquelleAutor Luís Soares
jackson 2.0 oder höher verwenden
@JsonInclude(Include.NON_NULL)
Dies wird entfernen Sie die beiden leeren und null-Objekte.
@Deprecated // since 2.0, marked deprecated in 2.6
vielen Dank für die Information aktualisiert wird in Antwort
InformationsquelleAutor Jekin Kalariya
Wenn Sie mit Jackson 2, der message-Wandler-tag:
InformationsquelleAutor Eduardo
Als Jackson 2.0,
@JsonSerialize(include = xxx)
verworfen wurde zugunsten von@JsonInclude
InformationsquelleAutor A B
Seit der version 1.6 haben wir neue annotation JsonSerialize (in der version 1.9.9 zum Beispiel).
Beispiel:
Default-Wert ist IMMER.
In alten Versionen, die Sie verwenden können, JsonWriteNullProperties, die veraltet ist in neuen Versionen.
Beispiel:
@JsonSerialize(include=Inclusion.NON_NULL)
veraltetInformationsquelleAutor grep
Für alle non-xml-config Leute:
InformationsquelleAutor cosbor11
Habe ich eine Lösung gefunden, durch die Konfiguration der Spring-container, aber es ist immer noch nicht genau, was ich wollte.
Ich drehte mich wieder zu Spring 3.0.5, entfernt und an seiner Stelle wechselte ich meine config-Datei:
Dies ist natürlich ähnlich Antworten in anderen Fragen, z.B.
konfigurieren der jacksonObjectMapper nicht in spring mvc 3
Die wichtige Sache zu beachten ist, dass mvc:annotation-driven und AnnotationMethodHandlerAdapter nicht im selben Kontext verwendet.
Ich bin immer noch nicht in der Lage, um es arbeiten mit Spring 3.1 und mvc:annotation-driven obwohl. Eine Lösung, die verwendet mvc:annotation-driven und alle Vorteile, die Sie begleiten, es wäre viel besser, denke ich. Wenn jemand mir zeigen könnte, wie Sie dies tun, das wäre toll.
InformationsquelleAutor mikec
Können Sie
JsonWriteNullProperties
für ältere Versionen von Jackson.Jackson 1.9+ verwenden
JsonSerialize.include
.InformationsquelleAutor