serve mvc images from java spring rest spring-mvc media-type

java - mvc - Primavera 3.1 o posterior @RequestMapping consume/produce



spring rest return outputstream (3)

Bien,

consume / produce toma String[] como parámetro (consulte RequestMapping de la documentación de Spring), así que creo que funcionará. También puedes probar headers = "content-type=application/json,application/xml" .

Tengo una pregunta con respecto a los consumos y producciones de parte del @RequestMapping . Tengo un punto final en el que quiero aceptar tanto JSON como XML y devolver JSON cuando se pasa JSON y devolver XML cuando se pasa XML. ¿Hay algo especial que debo hacer para que esto funcione?

El código de muestra se lista a continuación.

@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); }

¿ updateSomeObjectXML la forma que estoy esperando o necesito dos puntos finales updateSomeObjectXML y updateSomeObjectJson para manejar ambos casos?

Gracias Mike


El artículo del blog de Spring - Content Negotiation utilizando Spring MVC - proporciona detalles sobre cómo funciona la negociación de contenido con Spring MVC, en resumen, si desea que el mismo punto final maneje XML y JSON, su asignación es correcta, para resumir del artículo:

  1. Use la extensión de ruta: puede enviar un json a /something.json y xml a /something.xml y esperar lo mismo en el camino de regreso

  2. Use el encabezado Accept , use un valor de application/json o application/xml y use Content-Type para especificar el tipo de medio enviado.


Respuesta corta:
Anote el método con @ResponseBody, y el parámetro del método con @RequestBody, y funcionará (no se necesitan 2 métodos).

Explicación :
Primero, los atributos de producción y consumo se utilizan para restringir los tipos de mapeo . De forma predeterminada, se utilizará el primer HttpMessageConverter que coincida con el tipo de medio solicitado.

Segundo, el cliente solicita un tipo de medio dando el tipo de medio en:
- Aceptar encabezado de solicitud
- sufijo de URL (http: //....//some .xml => "application / xml" tipo de medio solicitado)
- Parámetro de formato de URL (... / some? Format = xls)

En tercer lugar, produce en combinación con @ResponseBody producirá el objeto en el tipo de medio solicitado (agradable para las solicitudes GET, cuando necesita enviar algo al cliente), y consume en combinación con @RequestBody consumirá el objeto con el medio solicitado type (agradable para solicitudes POST, cuando necesita obtener algo del cliente).

Cuatro, cuando no se usa @ResponseBody, HttpMessageConverters no se usa . Más bien, ViewResolvers activa y genera una vista (HTML, PDF ...), y el tipo de devolución debe seguir las reglas que acompañan a ViewResolvers (ver resolución de vista predeterminada y InternalResourceViewResolver para obtener más información).

Espero eso ayude.

Otras fuentes:
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