@RequestMapping 注解的 produce 参数
produces参数指明方法可返回给客户端的内容格式,spring会去和request头的Accept部分比较,如果发现相符合,则把方法返回值转换成相符合的格式(例如json, xml等),如果没有符合的,则返回406
RestController的方法上这么写
1 2
| @PostMapping(consumes = {MediaType.TEXT_XML_VALUE}, produces = {MediaType.TEXT_XML_VALUE})
|
用下面的命令测试没问题,因为Accept和上面的相符合,会返回xml
1 2 3 4 5
| curl -v \ -d '<TvSeriesDto><id>1</id><name>West Wrold</name><originRelease>2016-10-02</originRelease></TvSeriesDto>' \ -X POST -H 'Content-type:text/xml' \ -H 'Accept:text/xml' \ http://localhost:8080/tvseries
|
如果用下面的命令,则会返回406, Could not find acceptable representation。因为request头accept设置的信息和方法注解produces参数设置没有相符合(applicaiton/xml和text/xml被认为是不同的)
1 2 3 4 5
| curl -v \ -d '<TvSeriesDto><id>1</id><name>West Wrold</name><originRelease>2016-10-02</originRelease></TvSeriesDto>' \ -X POST -H 'Content-type:text/xml' \ -H 'Accept:application/xml' \ http://localhost:8080/tvseries
|
多个produces参数的顺序的影响
RestController上的RequestMapping的produces参数可以设置多个MediaType, 多个MediaType的顺序也会对结果有些影响,例如:
1 2
| @PostMapping(consumes = {MediaType.TEXT_XML_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_XML_VALUE})
|
1 2 3 4
| curl -v -d '<TvSeriesDto><id>1</id><name>West Wrold</name><originRelease>2016-10-02</originRelease></TvSeriesDto>' \ -X POST \ -H 'Content-type:text/xml' \ -H 'Accept:*/*' http://localhost:8080/tvseries
|
得到的是JSON格式,如果把produces参数顺序调整成
1 2
| @PostMapping(consumes = {MediaType.TEXT_XML_VALUE}, produces = {MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})
|
用同样的curl命令,则得到的是XML格式。
设置默认的格式
可以通过配置,修改默认的格式
1 2 3 4 5 6 7 8 9 10
| @Configuration public class WebAppConfigurer extends WebMvcConfigurationSupport {
@Override protected void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.defaultContentType(MediaType.APPLICATION_JSON); }
}
|