11 votes

Spring MVC 3.2 et le problème de JSON ObjectMapper

J'ai récemment mis à niveau ma version de Spring de 3.1.2 à 3.2.0. Je constate que les propriétés JSON telles que wrap Root element, prevent null values qui sont définies dans ObjectMapper ne fonctionnent plus.

Voici l'extrait de code

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" /> 
    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="true" />
    <property name="ignoreAcceptHeader" value="false" /> 
    <property name="mediaTypes" >
        <value>
            json=application/json
            xml=application/xml
        </value>
    </property>
</bean>

et le convertisseur JSON

<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
   <property name="objectMapper" ref="customJacksonObjectMapper"/>  
   <property name="supportedMediaTypes" value="application/json"/>
</bean>

Code du mappeur d'objets

public class CustomJacksonObjectMapper extends ObjectMapper {

@SuppressWarnings("deprecation")
public CustomJacksonObjectMapper() {
    super();
    final AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();

    this.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
    this.configure(org.codehaus.jackson.map.SerializationConfig.Feature.WRAP_ROOT_VALUE, true);

    this.configure(org.codehaus.jackson.map.SerializationConfig.Feature.WRITE_NULL_PROPERTIES, false);

    this.setDeserializationConfig(this.getDeserializationConfig().withAnnotationIntrospector(introspector));
    this.setSerializationConfig(this.getSerializationConfig().withAnnotationIntrospector(introspector));

   }
}

Version Jackson

<dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-xc</artifactId>
        <version>1.9.7</version>
    </dependency>

Quel pourrait être le problème ? Toute indication est la bienvenue.

0voto

Maze Points 176

Même s'il s'agit d'un vieux post, j'ai rencontré un problème similaire (peut-être même le même ?). J'ai trouvé le problème suivant (et cela pourrait en aider d'autres) :

  • Une bibliothèque supplémentaire qui a été ajoutée a une dépendance transitoire sur Jackson 2.x
  • Jusqu'à présent, nous avions une dépendance sur Jackson 1.x
  • Entre Jackson 1.x et Jackson 2.x, l'espace de noms a été modifié pour éviter les conflits.
  • Sprint a commencé à prendre la version la plus récente (2.x).
  • L'annotation était encore à l'ancienne (1.x) version

Pour résoudre ce problème, je peux soit :

  1. supprimer à nouveau la version 2.x
  2. Mettre à jour l'annotation à la version 2.x
  3. Ajouter une annotation supplémentaire pour couvrir également la version 2.x

Dans mon cas, j'ai opté pour la solution 3, car nous avons besoin de deux versions différentes et l'annotation supplémentaire n'a pas ajouté de frais généraux importants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X