----我理解的是转换返回数据的格式,也就是 返回的内容类型 ----

----注:@consumes是指定处理请求的提交内容类型。两者刚好相反----

注解@Produces用于定义方法的响应实体的数据类型,可以定义一个或多个,同时可以为每种类型定义质量因素(qualityfactor)。

质量因素是取值范围从0到1的小数值。如果不定义质量因素,那么该类型的质量因素默认为1。

我们将结合示例深入了解@Produces注解对媒体类型的影响,示例代码如下。

 
  1. @Path("conneg-resource")
  2. public class ConnegResource {
  3. @GET
  4. @Path("{id}")
  5. //关注点1:媒体类型为XML
  6. @Produces(MediaType.APPLICATION_XML)
  7. public Book getJaxbBook(@PathParam("id") final Long bookId) {
  8. return new Book(bookId);
  9. }
  10. @GET
  11. @Path("{id}")
  12. //关注点2:媒体类型为JSON
  13. @Produces(MediaType.APPLICATION_JSON)
  14. public Book getJsonBook(@PathParam("id") final Long bookId) {
  15. return new Book(bookId);
  16. }
  17. }

在这段代码中,getJaxbBook()和getJsonBook()是同等质量因素、资源地址相同的两个GET方法,一个定义响应实体格式为XML,

一个定义响应实体格式为JSON,见关注点1和2。那么对同一个资源的访问,JAX-RS2该如何选择处理方法呢?

如果请求中明确定义可接受的数据类型为两者之一,处理方法应该是定义相应数据类型的方法。如果两者都定义了,

处理方法应该是质量因素高的方法。如果两者都定义,而且数据类型的质量因素是相等的或者没有定义Accept,XML的方法会被优先选择。

客户端明确表述格式为XML,Jersey通过内容协商,会选择getJaxbBook()作为相应的资源方法来处理该请求。其测试代码如下所示。

 
  1. WebTarget path = target("conneg-resource").path("123");
  2. Builder request = path.request(MediaType.APPLICATION_XML_TYPE);
  3. Book book = request.get(Book.class);
  4. 1 > GET http://localhost:9998/conneg-resource/123
  5. 1 > Accept: application/xml
  6. 2 < Content-Type: application/xml
  7. <?xml version="1.0" encoding="UTF-8" standalone="yes"?><book bookId="123"/>

接下来,测试一个稍微复杂的内容协商。客户端明确表述格式的质量因素JSON高于XML,Jersey会选择资源方法getJsonBook()来处理请求。

示例代码如下所示。

 
  1. WebTarget path = target("conneg-resource").path("123");
  2. Builder request = path.request();
  3. request.header("Accept", "application/xml;q=0.1,application/json;q=0.2");
  4. Book book = request.get(Book.class);
  5. ...1 > GET http://localhost:9998/conneg-resource/123 1 > Accept: application/xml;q=0.1,application/json;q=0.2 2 < Content-Type: application/json {"bookId":123}

现在我们清楚了两个同等方法的场景,再来看一个方法中多种数据类型的场景。示例代码如下。

 
  1. ...java
  2. @GET
  3. @Produces({ "application/json; qs=.9", "application/xml; qs=.5" })
  4. @Path("book/{id}")
  5. public Book getBook(@PathParam("id") final Long bookId) {
  6. return new Book(bookId);
  7. }

在这段代码中,getBook()方法定义了XML和JSON两种表述数据类型,XML的质量因素是0.5(0可以省略),JSON的是0.9。

因此,可以推断,如果客户端请求中,明确接收的数据类型是两者之一,响应实体使用指定类型。

如果没有定义或者两者都定义且JSON的质量因素大于或者等于XML,则返回JSON类型。

还有一种用例是,两者都定义但JSON的质量因素小于XML,该如何处理请求方法呢?

答案是:内容协商的结果按照客户端的喜好选择响应实体的数据类型,即选择XML格式。

其测试代码如下所示,客户端明确表述格式XML优于JSON,虽然服务器端定义的资源方法中JSON的质量因素高,

但Jersey会根据客户端的喜好,选择了XML格式作为表述的格式返回。

 
  1. WebTarget path = target("conneg-resource").path("book").path("123");
  2. Builder request = path.request();
  3. request.header("Accept", "application/xml;q=0.7,application/json;q=0.2");
  4. Book book = request.get(Book.class);
  5. 1 > GET http://localhost:9998/conneg-resource/book/123
  6. 1 > Accept: application/xml;q=0.7,application/json;q=0.2
  7. 2 < Content-Type: application/xml
  8. <?xml version="1.0" encoding="UTF-8" standalone="yes"?><book bookId="123"/>

转载自:http://book.51cto.com/art/201701/529132.htm

spring丶@produces注解-作用解答相关推荐

  1. spring的各种注解的作用-持续更新中

    所谓的注入到底啥意思? 其实就是spring内部的import 和python里面的import numpy差不多的效果. 依赖注入: 扯白了就是你自己写的对象,需要被spring兼容. 先说说所谓的 ...

  2. @enableautoconfiguration注解作用_如何让代码变“高级”-Spring组合注解提升代码维度(这么有趣)...

    [如何让代码变"高级"]-Spring组合注解提升代码维度 "致"高级"工程师(BUG工程师) 一颗折腾的心:heartpulse: 原创不易,点个赞 ...

  3. Spring中@AliasFor注解的作用及原理

    本文基于Springboot 2.1.6.RELEASE 版本分析. 关于@AliasFor注解,曾提过的一个issue Explicit attribute overrides configured ...

  4. Spring注解@NonNull作用 Spring注解@Nullable作用 Spring NonNull 注解作用 Spring Nullable注解作用

    Spring注解@NonNull作用 Spring注解@Nullable作用 Spring NonNull 注解作用 Spring Nullable注解作用 一.概述 在看Spring源码的时候,经常 ...

  5. Spring中常用注解的介绍

    spring中使用注解时配置文件的写法: <?xml version="1.0" encoding="UTF-8"?> <span style ...

  6. spring : springmvc常用注解标签详解(转)

    新的项目,新的学习,好久没用这些注解了,同时在学习使用shiro ,lucene 等等.在网上找了些博文,感谢作者的总结和分享. 欢迎交流,言归正传: 1.@Controller 在SpringMVC ...

  7. 火眼金睛,看透Spring处理Import注解的全过程

    文章目录 一.前言 二.Enable前缀的注解上面有@Import注解 三.常见的四种Import注解用法(根据类Abc的不同类型) 四.Spring处理@Import注解的过程(全文重点,对应四种@ ...

  8. spring mvc常用注解的说明

    spring mvc常用注解的说明 最近一段时间学习了springboot,所以熟悉一下mvc中常用的注解,这样可以方便开发 简介: @RequestMapping RequestMapping是一个 ...

  9. Spring中@Autowired注解、@Resource注解的区别

    Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...

最新文章

  1. 《深入理解Java虚拟机》(第二版)学习2:垃圾收集算法
  2. 应用OpenCV进行图像旋转和平移
  3. python脚本语言采用声音作为手段_LKJ自动化测试脚本定义及生成技术研究
  4. 关于VSCode中工作区的讲解与使用工作区还你一个轻量 的VSCode
  5. 接口interface修饰符相关问题总结
  6. python django restful框架_python+django+rest框架配置创建方法
  7. git将本地仓库推送到远程仓库
  8. WebForm与MVC模式优缺点
  9. C#之Application.DoEvents()
  10. matlab微带带通滤波器,带通滤波器的ADS仿真设计
  11. linux 神舟z7,老船长带你神舟战神Z7使用进阶
  12. 虎赢大数据:“企业工商数据价值挖掘”,是2020年大数据创业发展的方向之一
  13. 20.P153课后习题6-13 背包问题。设有一个背包可以放入物品的重量为s,现有n件物品,重量分别为w[0],w[1],...w[n-1]。问题是能否从这n件物品中选择若干件放入此背包中使得放入的重
  14. 《通关!游戏设计之道》给游戏编个故事
  15. 绩效考核成绩管理平台
  16. 个人发展(职业规划)
  17. 美团 CEO 王兴:从 0 到干到 300 亿美金,格局上输了,再多努力都不可能赢
  18. 归一化数字角频率_说一说信号与系统中的“归一化处理“
  19. Markdown学习规划
  20. 开源数据同步备份工具(MySQL、Oracle、SqlServer、PostgreSQL)

热门文章

  1. 时间电影网 网页设计
  2. DirectX风雨路 10年3D技术与显卡变迁
  3. 如何使用fiddler过滤请求
  4. 文字过长(限制字数)截取
  5. DuiVision开发教程(1)-创建DuiVision工程
  6. linux内核 阅读,Linux内核阅读感悟
  7. 未能加载文件或程序集“ypt_ywgd”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。...
  8. jenkins执行报错 Finished: UNSTABLE
  9. Python爬虫:通信和线程池进程池
  10. Popup menu:弹出式菜单