spring丶@produces注解-作用解答
----我理解的是转换返回数据的格式,也就是 返回的内容类型 ----
----注:@consumes是指定处理请求的提交内容类型。两者刚好相反----
注解@Produces用于定义方法的响应实体的数据类型,可以定义一个或多个,同时可以为每种类型定义质量因素(qualityfactor)。
质量因素是取值范围从0到1的小数值。如果不定义质量因素,那么该类型的质量因素默认为1。
我们将结合示例深入了解@Produces注解对媒体类型的影响,示例代码如下。
- @Path("conneg-resource")
- public class ConnegResource {
- @GET
- @Path("{id}")
- //关注点1:媒体类型为XML
- @Produces(MediaType.APPLICATION_XML)
- public Book getJaxbBook(@PathParam("id") final Long bookId) {
- return new Book(bookId);
- }
- @GET
- @Path("{id}")
- //关注点2:媒体类型为JSON
- @Produces(MediaType.APPLICATION_JSON)
- public Book getJsonBook(@PathParam("id") final Long bookId) {
- return new Book(bookId);
- }
- }
在这段代码中,getJaxbBook()和getJsonBook()是同等质量因素、资源地址相同的两个GET方法,一个定义响应实体格式为XML,
一个定义响应实体格式为JSON,见关注点1和2。那么对同一个资源的访问,JAX-RS2该如何选择处理方法呢?
如果请求中明确定义可接受的数据类型为两者之一,处理方法应该是定义相应数据类型的方法。如果两者都定义了,
处理方法应该是质量因素高的方法。如果两者都定义,而且数据类型的质量因素是相等的或者没有定义Accept,XML的方法会被优先选择。
客户端明确表述格式为XML,Jersey通过内容协商,会选择getJaxbBook()作为相应的资源方法来处理该请求。其测试代码如下所示。
- WebTarget path = target("conneg-resource").path("123");
- Builder request = path.request(MediaType.APPLICATION_XML_TYPE);
- Book book = request.get(Book.class);
- 1 > GET http://localhost:9998/conneg-resource/123
- 1 > Accept: application/xml
- 2 < Content-Type: application/xml
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?><book bookId="123"/>
接下来,测试一个稍微复杂的内容协商。客户端明确表述格式的质量因素JSON高于XML,Jersey会选择资源方法getJsonBook()来处理请求。
示例代码如下所示。
- WebTarget path = target("conneg-resource").path("123");
- Builder request = path.request();
- request.header("Accept", "application/xml;q=0.1,application/json;q=0.2");
- Book book = request.get(Book.class);
- ...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}
现在我们清楚了两个同等方法的场景,再来看一个方法中多种数据类型的场景。示例代码如下。
- ...java
- @GET
- @Produces({ "application/json; qs=.9", "application/xml; qs=.5" })
- @Path("book/{id}")
- public Book getBook(@PathParam("id") final Long bookId) {
- return new Book(bookId);
- }
在这段代码中,getBook()方法定义了XML和JSON两种表述数据类型,XML的质量因素是0.5(0可以省略),JSON的是0.9。
因此,可以推断,如果客户端请求中,明确接收的数据类型是两者之一,响应实体使用指定类型。
如果没有定义或者两者都定义且JSON的质量因素大于或者等于XML,则返回JSON类型。
还有一种用例是,两者都定义但JSON的质量因素小于XML,该如何处理请求方法呢?
答案是:内容协商的结果按照客户端的喜好选择响应实体的数据类型,即选择XML格式。
其测试代码如下所示,客户端明确表述格式XML优于JSON,虽然服务器端定义的资源方法中JSON的质量因素高,
但Jersey会根据客户端的喜好,选择了XML格式作为表述的格式返回。
- WebTarget path = target("conneg-resource").path("book").path("123");
- Builder request = path.request();
- request.header("Accept", "application/xml;q=0.7,application/json;q=0.2");
- Book book = request.get(Book.class);
- 1 > GET http://localhost:9998/conneg-resource/book/123
- 1 > Accept: application/xml;q=0.7,application/json;q=0.2
- 2 < Content-Type: application/xml
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?><book bookId="123"/>
转载自:http://book.51cto.com/art/201701/529132.htm
spring丶@produces注解-作用解答相关推荐
- spring的各种注解的作用-持续更新中
所谓的注入到底啥意思? 其实就是spring内部的import 和python里面的import numpy差不多的效果. 依赖注入: 扯白了就是你自己写的对象,需要被spring兼容. 先说说所谓的 ...
- @enableautoconfiguration注解作用_如何让代码变“高级”-Spring组合注解提升代码维度(这么有趣)...
[如何让代码变"高级"]-Spring组合注解提升代码维度 "致"高级"工程师(BUG工程师) 一颗折腾的心:heartpulse: 原创不易,点个赞 ...
- Spring中@AliasFor注解的作用及原理
本文基于Springboot 2.1.6.RELEASE 版本分析. 关于@AliasFor注解,曾提过的一个issue Explicit attribute overrides configured ...
- Spring注解@NonNull作用 Spring注解@Nullable作用 Spring NonNull 注解作用 Spring Nullable注解作用
Spring注解@NonNull作用 Spring注解@Nullable作用 Spring NonNull 注解作用 Spring Nullable注解作用 一.概述 在看Spring源码的时候,经常 ...
- Spring中常用注解的介绍
spring中使用注解时配置文件的写法: <?xml version="1.0" encoding="UTF-8"?> <span style ...
- spring : springmvc常用注解标签详解(转)
新的项目,新的学习,好久没用这些注解了,同时在学习使用shiro ,lucene 等等.在网上找了些博文,感谢作者的总结和分享. 欢迎交流,言归正传: 1.@Controller 在SpringMVC ...
- 火眼金睛,看透Spring处理Import注解的全过程
文章目录 一.前言 二.Enable前缀的注解上面有@Import注解 三.常见的四种Import注解用法(根据类Abc的不同类型) 四.Spring处理@Import注解的过程(全文重点,对应四种@ ...
- spring mvc常用注解的说明
spring mvc常用注解的说明 最近一段时间学习了springboot,所以熟悉一下mvc中常用的注解,这样可以方便开发 简介: @RequestMapping RequestMapping是一个 ...
- Spring中@Autowired注解、@Resource注解的区别
Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...
最新文章
- 《深入理解Java虚拟机》(第二版)学习2:垃圾收集算法
- 应用OpenCV进行图像旋转和平移
- python脚本语言采用声音作为手段_LKJ自动化测试脚本定义及生成技术研究
- 关于VSCode中工作区的讲解与使用工作区还你一个轻量 的VSCode
- 接口interface修饰符相关问题总结
- python django restful框架_python+django+rest框架配置创建方法
- git将本地仓库推送到远程仓库
- WebForm与MVC模式优缺点
- C#之Application.DoEvents()
- matlab微带带通滤波器,带通滤波器的ADS仿真设计
- linux 神舟z7,老船长带你神舟战神Z7使用进阶
- 虎赢大数据:“企业工商数据价值挖掘”,是2020年大数据创业发展的方向之一
- 20.P153课后习题6-13 背包问题。设有一个背包可以放入物品的重量为s,现有n件物品,重量分别为w[0],w[1],...w[n-1]。问题是能否从这n件物品中选择若干件放入此背包中使得放入的重
- 《通关!游戏设计之道》给游戏编个故事
- 绩效考核成绩管理平台
- 个人发展(职业规划)
- 美团 CEO 王兴:从 0 到干到 300 亿美金,格局上输了,再多努力都不可能赢
- 归一化数字角频率_说一说信号与系统中的“归一化处理“
- Markdown学习规划
- 开源数据同步备份工具(MySQL、Oracle、SqlServer、PostgreSQL)
热门文章
- 时间电影网 网页设计
- DirectX风雨路 10年3D技术与显卡变迁
- 如何使用fiddler过滤请求
- 文字过长(限制字数)截取
- DuiVision开发教程(1)-创建DuiVision工程
- linux内核 阅读,Linux内核阅读感悟
- 未能加载文件或程序集“ypt_ywgd”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。...
- jenkins执行报错 Finished: UNSTABLE
- Python爬虫:通信和线程池进程池
- Popup menu:弹出式菜单