Ich habe einen Spring-Webservice, der eine JSON-Antwort zurückgibt. Ich bin mit dem hier gegebenen Beispiel den Dienst zu erstellen: http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/Spring REST Service: Wie konfiguriert man, um Nullobjekte in JSON-Antwort zu entfernen
Das Format der json zurückgegeben wird in ist: { "name": null, "staffName": [ "kfc-Kampar", "smith" ]}
ich irgendwelche null Objekte aus der zurückgegebene Antwort entfernen möchten, so dass es wie folgt aussieht: { "staffName": [ "kfc-Kampar", "smith"]}
ich habe ähnliche gefunden Fragen, die hier gestellt wurden, aber ich war in der Lage, eine Lösung zu bekommen, die zB funktioniert
Configuring ObjectMapper in Spring
configuring the jacksonObjectMapper not working in spring mvc 3
how to configure spring mvc 3 to not return "null" object in json response?
Spring configure @ResponseBody JSON format
Jackson+Spring3.0.5 custom object mapper
Beim Durchlesen dieser und anderer Quellen habe ich festgestellt, dass Spring 3.1 und die Nachrichtenkonverter, die in der mvc-Annotation konfiguriert werden können, am saubersten zu erreichen sind. Meine aktualisiert Frühjahr Konfigurationsdatei ist:
<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>
Die Service-Klasse ist die gleiche wie auf der mkyong.com Website gegeben, außer ich aus der Einstellung des Shop-Name Variable kommentiert, so dass es also
null ist@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;
}
}
Die Jackson Gläser, die ich benutze, sind jackson-mapper-asl 1.9.0 und jackson-core-asl 1.9.0. Dies sind die einzigen neuen Jars, die ich zum Pom hinzugefügt habe, die im Rahmen des Spring-JSON-Projekts zur Verfügung gestellt wurden, das ich von mkyong.com heruntergeladen habe.
Das Projekt baut erfolgreich, aber wenn ich den Dienst über den Browser aufrufen ich immer noch die gleichen, dh { "name": null, "staffName": [ "kfc-Kampar", "smith"]}
Kann mir jemand sagen, wo ich mit meiner Konfiguration falsch liege?
Ich habe mehrere andere Optionen ausprobiert, aber die einzige Möglichkeit, die JSON im richtigen Format zurückzugeben, ist, den Object Mapper zum JSONController hinzuzufügen und die "getShopInJSON" -Methode eine Zeichenfolge zurückgeben, dh
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 rufe ich die erwartete bekommen also { "staffName": [ "kfc-Kampar", "cronin"]}
ich habe auch in der Lage gewesen, um es an die Arbeit Verwenden Sie die @ JsonIgnore Annotation, aber diese Lösung ist nicht für mich geeignet.
Ich verstehe nicht, warum es in Code funktioniert, aber nicht in der Konfiguration, also wäre jede Hilfe fantastisch.
Für mich ist es Frühling schien nicht das Mapper-Objekt, das in der Contex-Datei definiert, i mit Debug-Feder geprüft ruft 'setSerializationInclusion()' Methode für Mapper-Objekt in xml definiert – Elbek
Ya, so verstehe ich es auch. Der Objekt-Mapper scheint korrekt konfiguriert zu sein, er wird nur nicht im Spring-Container verwendet. – mikec