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:
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 regresoUse el encabezado
Accept
, use un valor deapplication/json
oapplication/xml
y useContent-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