RequestMapping的produces参数

技术文档网 2021-04-28

RequestMapping的produces参数

produces参数指明方法可返回给客户端的内容格式,spring会去和request头的Accept部分比较,如果发现相符合,则把方法返回值转换成相符合的格式(例如json, xml等),如果没有符合的,则返回406

RestController的方法上这么写

@PostMapping(consumes = {MediaType.TEXT_XML_VALUE},
             produces = {MediaType.TEXT_XML_VALUE})

用下面的命令测试没问题,因为Accept和上面的相符合,会返回xml

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被认为是不同的)

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的顺序也会对结果有些影响,例如:

@PostMapping(consumes = {MediaType.TEXT_XML_VALUE},
             produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_XML_VALUE})
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参数顺序调整成

@PostMapping(consumes = {MediaType.TEXT_XML_VALUE},
             produces = {MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})

用同样的curl命令,则得到的是XML格式。

设置默认的格式

可以通过配置,修改默认的格式

@Configuration
public class WebAppConfigurer extends WebMvcConfigurationSupport {

    @Override
    protected void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        // 这里设置默认的返回格式
        configurer.defaultContentType(MediaType.APPLICATION_JSON);
    }

}

相关文章

  1. 基于-SLF4J-MDC-机制的日志链路追踪配置属性

    ums: # ================ 基于 SLF4J MDC 机制的日志链路追踪配置属性 ================ mdc: # 是否支持基于 SLF4J MDC

  2. ajax-跨域访问

    ajax 跨域访问 &lt;!DOCTYPE html&gt; &lt;html xmlns:th="http://www.w3.org/1999/xhtml"&gt; &lt;head&gt;

  3. 给第三方登录时用的数据库表-user_connection-与-auth_token-添加-redis-cache

    spring: # 设置缓存为 Redis cache: type: redis # redis redis: host: 192.168.88.88 port

  4. Java动态代理

    Jdk动态代理 通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口 应用 public class TestProxy { public

  5. Java读取classpath中的文件

    public void init() { try { //URL url = Thread.currentThread().getContextClassLo

随机推荐

  1. 基于-SLF4J-MDC-机制的日志链路追踪配置属性

    ums: # ================ 基于 SLF4J MDC 机制的日志链路追踪配置属性 ================ mdc: # 是否支持基于 SLF4J MDC

  2. ajax-跨域访问

    ajax 跨域访问 &lt;!DOCTYPE html&gt; &lt;html xmlns:th="http://www.w3.org/1999/xhtml"&gt; &lt;head&gt;

  3. 给第三方登录时用的数据库表-user_connection-与-auth_token-添加-redis-cache

    spring: # 设置缓存为 Redis cache: type: redis # redis redis: host: 192.168.88.88 port

  4. Java动态代理

    Jdk动态代理 通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口 应用 public class TestProxy { public

  5. Java读取classpath中的文件

    public void init() { try { //URL url = Thread.currentThread().getContextClassLo