2012-11-21 2 views
3

Exigence Je crée une API REST. Il a deux appels REST. L'appel/format de sortie JSON formaté en fonction des paramètres fournis. L'appel/raw avec les mêmes paramètres doit afficher JSON avec des valeurs brutes (sans le formatage). Le formatage ici serait spécifique aux paramètres régionaux, comme les changements de date, l'affichage de la devise correcte, le formatage décimal, le formatage de l'heure, etc. pour les valeurs.Comment utiliser plusieurs fournisseurs JSON avec CXF, Spring et Jackson

Outils Java, Tomcat, Spring, Apache CXF, JAX-RS et Jackson.

Mise en œuvre Le service REST est configuré et fonctionne correctement. Aucun problème là-bas. J'ai écrit séparément des sérialiseurs séparés dans lesquels je fournis le formatage désiré en utilisant NumberFormat, DateFormat, DecimalFormat etc. J'ai étendu le SimpleModule de Jackson pour enregistrer tous mes sérialiseurs faits sur commande mentionnés ci-dessus. J'utilise deux ObjectMapper distincts (FomatOM et RawOM) .FormatOM enregistre le module personnalisé pour la sortie JSON formatée, RawOM est pour la sortie JSON brute selon l'exigence. Ces deux objectmappers sont enregistrés auprès de deux JacksonJsonProviders différents et déclarés en tant que beans dans mon fichier print config xml. Pour/format j'utilise FormatOM avec des sérialiseurs personnalisés, et dans/raw j'utilise RawOM.

Problème Cela ne fonctionne pas comme je l'aurais prévu. Je m'attendais à ce que lorsque je fais une requête via l'appel/format, le FormatOM soit utilisé et que/Raw Raw soit utilisé. Qu'est-ce qui se passe est quel que soit l'appel que je fais d'abord, les appels suivants sont servis en utilisant le même ObjectMapper. Ainsi, si le premier appel est/raw; les appels ultérieurs à/format ou/raw rendent la sortie JSON brute. Après un redémarrage de Tomcat, si le premier appel est/format puis les appels suivants à soit les appels API Render formatées JSON

Questions 1. Comment parvenez-vous à mon exigence pour le rendu au format + JSON brut sortie? 2. Quel est le problème avec ma mise en œuvre? 3. Des idées, des suggestions ou des critiques? 4. Toute autre façon d'avoir des mappeurs basés sur les requêtes?

Merci

+0

Je ne faisais que jouer avec le code et je vais essayer d'automatiser JacksonJsonProvider et injecter le mappeur par demande. Je rapporterai si cela a fonctionné pour moi. – andthereitgoes

Répondre

0

Un travail autour est juste d'utiliser un StreamingOutput et ensemble particulier ObjectMapper là, l'utiliser directement (ObjectMapper.writeValue(output, value);)

0

Merci pour votre StaxMan de réponse. Comme j'utilise Spring, j'ai décidé d'injecter le JacksonJsonProvider et de faire JacksonJsonProvider.setMapper(mapper) pour définir le mappeur par requête. Si quelqu'un a essayé l'approche ci-dessus et a rencontré un problème, faites-le moi savoir. Si je rencontre un problème, je vais mettre à jour cette réponse.

Questions connexes