web-dev-qa-db-fra.com

Printemps 3.1 ou version ultérieure @RequestMapping consomme / produit

J'ai une question concernant les consommés et produit une partie de la @RequestMapping. Je souhaite accepter à la fois JSON et XML sur un noeud final et renvoyer JSON lorsque JSON est transmis, ainsi que XML lorsque XML est transmis. Dois-je faire quelque chose de spécial pour que cela fonctionne?

Exemple de code est répertorié ci-dessous.

@RequestMapping(value = "/something", method = PUT, 
                consumes = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE}, 
                produces = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE})
public SomeObject updateSomeObject(SomeObject acct) {
    return doStuff(acct);
}

Est-ce que cela fonctionnera comme prévu ou ai-je besoin de deux points finaux updateSomeObjectXML et updateSomeObjectJson pour traiter les deux cas?

Merci, mike

22
Mike Baglio Jr.

L'article du blog Spring - Négociation de contenu à l'aide de Spring MVC - fournit des informations détaillées sur le fonctionnement de la négociation de contenu avec Spring MVC. pour résumer de l'article:

  1. Utiliser l'extension de chemin - vous pouvez envoyer un JSON à /something.json et XML à /something.xml et attendons la même chose au retour

  2. Utilisez l'en-tête Accept, utilisez une valeur de application/json ou application/xml et utilise Content-Type pour spécifier le type de média soumis.

20
Biju Kunjummen

Réponse courte:
Annotez la méthode avec @ResponseBody et le paramètre de méthode avec @RequestBody, et cela fonctionnera (aucun besoin de 2 méthodes).

Explication :
Premièrement, les attributs de production et d'utilisation sont utilisés pour restreindre les types de mappage. Par défaut, le premier convertisseur HttpMessageConverter trouvé, qui correspond au type de support demandé, sera utilisé.

Deuxièmement, le client demande un type de média en indiquant le type de média dans:
- Accepter l'en-tête de la demande
- URL sufixé (http: //....//some . Xml = > type de média "application/xml" demandé)
- paramètre de format d'URL (.../some? Format = xls)

Troisièmement, produit en combinaison avec @ ResponseBody produira l'objet dans le type de média demandé (idéal pour les requêtes GET, lorsque vous devez renvoyer quelque chose au client), et consomme en combinaison avec @ RequestBody consommera l'objet avec le type de média demandé (Nice pour les demandes POST, lorsque vous devez obtenir quelque chose du client).

Quatre, lorsque @ResponseBody n'est pas utilisé, les HttpMessageConverters ne sont pas utilisés . ViewResolvers entre en jeu et génère une vue (HTML, PDF ...), et le type de retour doit suivre les règles qui accompagnent ViewResolvers (cochez la vue par défaut résolveur et InternalResourceViewResolver pour plus).

J'espère que ça aide.

Autres sources:
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#consumes-- - http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc

11
despot

Bien,

consomme/produit prend String[] comme paramètre (voir RequestMapping dans la documentation de Spring), donc je crois que cela fonctionnera. Vous pouvez aussi essayer headers = "content-type=application/json,application/xml".

1
freakman