8
votes

Spring MVC - forcer un contrôleur à produire MappingJacksonjsonview (s)

Ici, nous avons une webApp de base à l'aide de JSP qui doit fournir quelques URL de service de repos basées sur JSON.

Ces URL résident tous sous / services et être généré par un myrestservicescontroller .

Les exemples que je vois pour les paramètres Up JSON Vues basées sur JSON Toutes utilisent contesteNegotiateViewSolver . Mais il semble que ce résolveur soit exceptionnel car ce résolveur semble conçu pour des situations où la même URL pourrait produire une sortie différente.

Je veux juste que mon seul resservicescontroller Pour toujours produire MappingJacksonjson (s) .

Y a-t-il un moyen plus propre plus simple et plus simple de simplement diriger le contrôleur pour le faire?


2 commentaires

Vous souhaitez spécifiquement MappingJacksonJsonview ou voulez-vous juste que JSON soit sortie?


La sortie JSON est l'objectif ultime, en utilisant les composants de ressort standard, semble être une meilleure pratique. Johan l'a frappé sur la tête.


3 Réponses :


12
votes

Y a-t-il un moyen plus propre plus simple et plus simple de simplement diriger le contrôleur pour le faire? P>

oui il y a. Vous pouvez jeter un coup d'œil à cet exemple que j'ai publié dans Forums de printemps . En bref, je préfère le faire est à travers ce qui suit. P>

ApplicationContext: P>

@RequestMapping("/service")
public ModelAndView getResultAsJson() {
    Object jsonObj = // the java object which we want to convert to json
    return new ModelAndView("jsonView", "result", jsonObj);
}

1 commentaires

Oh yeh, cela a le sens total et est très simple. Exactement ce que j'espérais, et une réponse super rapide. Un million de merci. Je dois avoir lu sur le résolveur du beanName 5 fois et il n'a jamais cliqué pour l'utiliser, je pense que ma tête était toujours bloquée dans des modèles-terre.



9
votes

Si tout ce que vous avez à faire est de produire JSON, la couche de vue elle-même est redondante. Vous pouvez Utilisez le @ Responsebody Annotation Pour déterminer le printemps à sérialiser votre modèle directement, à l'aide de Jackson. Il nécessite moins de configuration que l'approche MappingJacksonjsonview , et le code est moins encombré.


2 commentaires

+1 Cela fonctionne pour moi. Savez-vous comment je pourrais changer le type de contenu?


Il y a un inconvénient à @Responsebody, après le retour du contrôleur, la vue est immédiatement rendue, ce qui ferme les en-têtes HTTPResponse afin que les en-têtes ne puissent être ajoutés (par exemple, à travers une méthode posthandle d'un intercepteur). L'utilisation d'un contenuGotiedViewResolver n'a pas ce problème.



3
votes

Tant que vous utilisez MVC: Annotation-Driven et Jackson est sur le path de classe, alors tout ce que vous devriez avoir à faire est d'utiliser @Responsebody sur vos méthodes et que le type de retour sera converti en JSON par standard conversion de message HTTP

Découvrez également cette vidéo vers 37h00: Maîtrise du printemps MVC .


1 commentaires

Merci pour le lien vidéo, regardez-le.