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 MappingJacksonHttpMessageConverter während mit spring-annotation-basierte Konfiguration?

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.

Für mich schien Es der Frühling ist nicht mit dem mapper-Objekt, das definiert ist in den contex-Datei, das habe ich überprüft mit debug Frühling ruft setSerializationInclusion() Methode für die mapper-Objekt im xml-Format definiert
Ya 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

Schreibe einen Kommentar