web-dev-qa-db-fra.com

comment configurer spring mvc 3 pour ne pas retourner d'objet "null" dans la réponse json?

un exemple de réponse json ressemble à ceci:

{"publicId":"123","status":null,"partner":null,"description":null}

Ce serait bien de tronquer tous les objets nuls dans la réponse. Dans ce cas, la réponse deviendrait {"publicId":"123"}.

Aucun conseil? Merci!

P.S: Je pense que je peux le faire à Jersey. Je pense également qu'ils utilisent tous les deux Jackson comme processeur JSON.

Ajouté plus tard: Ma configuration:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- Scans the classpath of this application for @Components to deploy as beans -->
    <context:component-scan base-package="com.SomeCompany.web" />

    <!-- Application Message Bundle -->
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="/WEB-INF/messages/messages" />
        <property name="cacheSeconds" value="0" />
    </bean>

    <!-- Configures Spring MVC -->
    <import resource="mvc-config.xml" />
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!-- Configures the @Controller programming model -->
    <mvc:annotation-driven />

    <!-- Forwards requests to the "/" resource to the "welcome" view -->
    <!--<mvc:view-controller path="/" view-name="welcome"/>-->

    <!-- Configures Handler Interceptors -->    
    <mvc:interceptors>
        <!-- Changes the locale when a 'locale' request parameter is sent; e.g. /?locale=de -->
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
    </mvc:interceptors>

    <!-- Saves a locale change using a cookie -->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />

    <!--<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="mediaTypes">
            <map>
                <entry key="atom" value="application/atom+xml"/>
                <entry key="html" value="text/html"/>
                <entry key="json" value="application/json"/>
                <entry key="xml" value="text/xml"/>
            </map>
        </property>
        <property name="viewResolvers">
            <list>
                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                    <property name="prefix" value="/WEB-INF/views/"/>
                    <property name="suffix" value=".jsp"/>
                </bean>
            </list>
        </property>
        <property name="defaultViews">
            <list>
                <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView" >
                    <property name="marshaller">
                        <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller" />
                    </property>
                </bean>
            </list>
        </property>
    </bean>
-->
  <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

Mon code:

@Controller
public class SomeController {
    @RequestMapping(value = "/xyz", method = {RequestMethod.GET, RequestMethod.HEAD},
    headers = {"x-requested-with=XMLHttpRequest","Accept=application/json"}, params = "!closed")
    public @ResponseBody
    List<AbcTO> getStuff(
          .......
    }
}
30
Bobo

Oui, vous pouvez le faire pour des classes individuelles en les annotant avec @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) ou vous pouvez le faire de manière générale en configurant votre ObjectMapper, en définissant l'inclusion de sérialisation sur JsonSerialize.Inclusion.NON_NULL.

Voici quelques informations de la FAQ Jackson: http://wiki.fasterxml.com/JacksonAnnotationSerializeNulls .

L'annotation des classes est simple, mais la configuration de la configuration de sérialisation ObjectMapper est un peu plus délicate. Il y a quelques informations spécifiques sur ce dernier ici .

32
BennyFlint

Ne répond pas à la question mais c'est le deuxième résultat google.

Si quelqu'un vient ici et veut le faire pour le printemps 4 (comme cela m'est arrivé), vous pouvez utiliser l'annotation

@JsonInclude(Include.NON_NULL)

sur la classe de retour.

Comme mentionné dans les commentaires, et en cas de confusion, l'annotation doit être utilisée dans la classe qui sera convertie en JSON.

18
Mário Fernandes

Si vous utilisez Spring Boot pour REST, vous pouvez le faire dans application.properties:

spring.jackson.serialization-inclusion=NON_NULL

source

9
Luís Soares

Configuration Java pour ce qui précède. Placez simplement ce qui suit dans votre classe @Configuration.

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.serializationInclusion(JsonInclude.Include.NON_NULL);
    return builder;
}
1
Norbert