Printemps, Jackson et la Personnalisation (par exemple CustomDeserializer)
Être encore un peu familier avec le Printemps, j'ai rencontré un problème qui rend nécessaire la mise en œuvre de mes personnalisé deserialzer pour Jackson. La procédure est décrite dans un petit tutoriel, cependant, je suis coincé avec le Printemps. Je ne comprends pas, où
ObjectMapper mapper = new ObjectMapper();
dans Spring MVC est effectué lors de l'json est désérialise par une méthode de la classe du contrôleur. Donc je ne sais pas, quoi faire pour remplacer la valeur par défaut deserializer par un deserialiser.
Toutes les suggestions que la plupart de bienvenue.
Vous devez vous connecter pour publier un commentaire.
Vous ne dites pas comment vous utilisez Jackson au Printemps, donc je vais supposer que vous êtes à l'utiliser via
<mvc:annotation-driven/>
et la@RequestBody
et/ou@ResponseBody
annotations.L'une des choses que
<mvc:annotation-driven/>
n'est à enregistrer unAnnotationMethodHandlerAdapter
bean qui est livré avec un certain nombre de pré-configuréHttpMessageConverter
haricots, y comprisMappingJacksonHttpMessageConverter
, qui s'occupe de l'ordonnancement et de Jackson-modèle annoté classes.Maintenant
MappingJacksonHttpMessageConverter
a unsetObjectMapper()
méthode, qui permet de remplacer la valeur par défautObjectMapper
. Mais depuisMappingJacksonHttpMessageConverter
est créé en coulisses par<mvc:annotation-driven/>
, vous ne pouvez pas l'obtenir.Cependant,
<mvc:annotation-driven/>
est juste un moyen pratique de raccourci. C'est tout aussi valable pour déclarer votre propreAnnotationMethodHandlerAdapter
bean, injecter votre propreMappingJacksonHttpMessageConverter
bean (via lemessageConverters
de la propriété), et l'injection de votre propre personnaliséObjectMapper
dans que.Vous avez alors le problème de savoir comment construire une coutume
ObjectMapper
, car elle n'est pas très Printemps-amicale de la classe. Je suggère la rédaction de votre propre simple de mise en œuvre deinterface factorybean
.Donc, si vous voulez retrouver avec quelque chose comme ceci:
Nouvelle façon de faire de ce Printemps 3.1:
http://magicmonster.com/kb/prg/java/spring/webmvc/mvc_spring_config_namespace.html
http://blog.springsource.org/2011/02/21/spring-3-1-m1-mvc-namespace-enhancements-and-configuration/
Vous permet de faire quelque chose comme ceci:
La solution référencé par Rakesh susceptibles fonctionne avec Spring MVC 3.0 mais avec 3,1 certains de la MVC de l'infrastructure a changé. En conséquence, vous ne pouvez pas avoir un
AnnotationMethodHandlerAdapter
bean enregistré dans votre contexte de l'application et vous vous retrouverez avec unBeanCreationException
pendant la phase d'initialisation.Pour Spring MVC 3.1 la
mvc:annotation-driven
élément va créer un RequestMappingHandlerAdapter pour vous, alors vous devriez autowire ce type à la place. Il sera toujours fournir un accès à la liste des HttpMessageConverters et vous permettent de définir le ObjectMapper bien sur laMappingJacksonHttpMessageConverter
. Cela nécessite aussi un léger changement dans leinit
. méthode pour le type de la HttpMessageConverters de référence.La mise à jour de classe ressemble à:
Mise à JOUR: Il s'avère absolue de la chose la plus facile à faire avec Printemps 3.1 est d'ajouter une configuration supplémentaire pour votre MVC configuration:
Qui va ajouter une nouvelle instance de
MappingJacksonHttpMessageConverter
avec la coutume ObjectMapper avant tout de la valeur par défaut HttpMessageConverters (qui sont encore présents en raison deregister-defaults="true"
).Dans mon cas (Printemps 3.2.4 et Jackson 2.3.1), de configuration XML personnalisé sérialiseur:
était dans inexpliquée façon écrasé par défaut par quelque chose.
Cela a fonctionné pour moi:
CustomObject.java
CustomObjectSerializer.java
Pas de configuration XML (
<mvc:message-converters>(...)</mvc:message-converters>
) est nécessaire dans ma solution.Je souhaite que je savais Spring MVC mieux, mais avec Jax-RS implémentations comme Jersey et RESTeasy, l'un des registres des fournisseurs. Peut-être que le Printemps fait quelque chose de similaire?
Le printemps docs pour MappingJacksonHttpMessageConverter état:
2.4.5 MappingJacksonHttpMessageConverter
Un HttpMessageConverter de mise en œuvre qui peut lire et écrire JSON à l'aide de Jackson JSON du Processeur ObjectMapper. JSON cartographie peut être personnalisée en tant que de besoin par le biais de l'utilisation de Jackson a fourni des annotations. Lorsque plus de contrôle est nécessaire, une coutume ObjectMapper peut être injecté dans le ObjectMapper propriété pour les cas où JSON personnalisé sérialiseurs/deserializers doivent être fournis pour des types spécifiques. Par défaut, ce convertisseur prend en charge (application/json).
Ne pourriez-vous autowire l'accès à la ObjectMapper afin de modifier son comportement?