JAX-RS 2.0:服务器端处理管道

这篇文章的灵感来自JAX-RS 2.0规范文档 (附录C)中的Processing Pipeline部分。 我喜欢它是因为它提供了JAX-RS中所有模块的漂亮快照-以准备好吞咽的胶囊形式!

礼貌– JAX-RS 2.0规范文档

礼貌– JAX-RS 2.0规范文档

因此,我想到了使用此图简要概述不同的JAX-RS组件以及它们如何相互配合。

涵盖了什么?

  • 过滤器(请求和响应)
  • 方法匹配
  • 注射
  • 拦截器(请求和响应)
  • 实体提供者(请求和响应)

注意:这里讨论的是服务器端处理管道,即在客户端发送HTTP请求(GET,POST,PUT等)后触发的动作序列

当客户端(浏览器或自定义REST客户端)向您的RESTful服务发送HTTP请求时,一切就开始了!

请求过滤器(链)

请求过滤器

客户端请求由JAX-RS过滤器处理。 它们适用于服务器端和客户端(我们将研究服务器端过滤器-基于请求和响应)

  • 过滤器是可选组件,您可以通过简单地实现ContainerRequestFilter接口来编写过滤器。 需要使用@Provider批注对它们进行批注,以通过JAX-RS运行时自动检测
  • 可以更改ContainerRequestContext的实例并更改标头,Cookie,URI等属性。过滤器不允许您访问HTTP请求正文/消息有效负载( 拦截器可以执行此操作)
  • 可用于实现日志记录,身份验证等
  • 如果需要在资源方法匹配之前执行过滤器实现类,请在实现类上使用@PreMatching批注。
  • 筛选器可以绑定到所有JAX-RS方法(全局),也可以使用@NamedBinding批注或DynamicFeature接口的实现有选择地绑定
  • @Priority批注可用于确定多个过滤器(顺序链)的执行顺序。

方法匹配

在(成功)执行过滤器之后,JAX-RS运行时将启动资源方法匹配过程

  • 要调用的确切方法基于规范概述的算法 (尽管JAX-RS提供程序不受其约束)
  • 由以下提到的注释的组合确定
  • @ GET,@ PUT,@ POST,@ DELETE等–这些注释应与实际的HTTP操作匹配(注释到HTTP动词的映射非常明显)
  • @Path –其值(相对于上下文根)用于映射请求URI,例如/ tweeters / all
  • @Consumes –其值应与HTTP请求中发送的Content-Type标头值匹配
  • @Produces –其值应与HTTP请求中发送的Accept标头值匹配

HTTP组件注入

方法匹配完成后,所需的HTTP组件将在JAX-RS运行时注入到JAX-RS资源类中(如果已配置)。 我们需要做的就是使用适当的注释

HTTP URI参数

  • @QueryParam –从URI查询参数中提取值并将其注入,例如, http : //tweeter.com/info?tweeter = abhi_tweeter上的GET请求
  • @PathParam –从URI模板参数中提取值并将其注入,例如在http://tweeter.com/info/tweeter/abhi_tweeter上的GET请求
  • @MatrixParam –从URI矩阵参数中提取值并将其注入

其他HTTP组件

JAX-RS使访问(注入)HTTP请求组件(例如标头,cookie甚至HTTP表单数据)变得容易

  • @HeaderParam –提取请求的标头。 您还可以使用@Context批注注入HttpHeaders实例
  • @CookieParam –用于从HTTP请求注入HTTP cookie
  • @FormParam –可以帮助使用HTTP POST请求从通过HTML表单发送的属性中插入值
  • @BeanParam –可以帮助在自定义域类的实例变量上使用上述所有与注入相关的注释,而不是使用这些注释将值注入各个方法参数

请求拦截器(链)

req-interceptors-entityproviders

拦截器适用于服务器端和客户端(我们将仅查看服务器端拦截器-基于请求和响应)

  • 拦截器有助于在处理HTTP请求有效负载之前对其进行突变
  • 仅当在JAX-RS运行时中注册了MessageBodyReader (请参见下一主题)实现时,才调用请求拦截器。
  • 用于传入服务器请求的拦截器由ReaderInterceptor接口的实现处理,并且需要使用@Provider注释进行注释,以由JAX-RS运行时自动检测
  • ReaderInterceptorContext实例在JAX-RS运行时传递,并且可以使用java.io.InputStream形式访问HTTP正文。
  • 拦截器可以(全局)绑定到所有JAX-RS方法,也可以通过使用@NamedBinding批注或DynamicFeature接口的实现有选择地绑定
  • 拦截器可以被链接和(使用@priority)和优先呼叫的继续进行ReaderInterceptorContext的方法自动调用链中的或化MessageBodyReader实现本身下一个拦截
  • ReaderInterceptor充当MessageBodyReader的包装器(在内部调用)

实体提供者(

实体提供者帮助将HTTP消息有效负载转换为适当的Java类型(用于注入到JAX-RS资源类的方法参数中),反之亦然

  • HTTP请求有效负载到其对应的Java类型的转换是通过实现MessageBodyReader接口的具体类完成的
  • MessageBodyReader实现的readFrom方法是执行操作的地方。 JAX-RS运行时会传入所有上下文信息,包括有效载荷本身(以InputStream的形式),然后可以对其进行自省并将其转换为适当的Java类型。
  • JAX-RS规范要求,对于某些Java类型(例如String,InputStream,File等),实现应包含MessageBodyReader接口的现成实现。

响应过滤器(链)

过滤器

响应过滤器类似于前面讨论的以请求为中心的过滤器。

  • 响应过滤器是可选组件,您可以通过简单地实现ContainerResponseFilter接口来编写一个。
  • 这些类型的过滤器用于修改响应标头,添加cookie等。可以更改ContainerResponseContext的实例并更改属性以实现此目的。 过滤器不允许您访问HTTP响应正文/消息有效负载( 拦截器可以执行此操作)
  • 需要使用@Provider批注对它们进行批注,以通过JAX-RS运行时自动检测
  • 筛选器可以绑定到所有JAX-RS方法(全局),也可以使用@NamedBinding批注或DynamicFeature接口的实现有选择地绑定
  • @Priority批注可用于确定多个过滤器(顺序链)的执行顺序。

响应拦截器(链)

resp-interceptors-entityproviders1

  • 仅当注册MessageBodyWriter (请参阅下一主题)以处理传出的HTTP有效负载时,才调用它们。
  • 传出服务器响应的拦截器由类WriterInterceptor的实现处理,并且需要使用@Provider注释进行注释,以由JAX-RS运行时自动检测
  • 可以将拦截器进行链接和确定优先级(使用@Priority),并调用WriterInterceptorContext的proce方法会自动调用链中的下一个拦截器或MessageBodyWriter实现本身
  • WriterInterceptor充当MessageBodyWriter的包装器(在内部调用)

实体提供者(

  • 应用程序代码返回的Java对象到HTTP响应有效负载的转换是通过实现MessageBodyWriter接口的具体类完成的
  • MessageBodyWriter实现的writeTo方法是执行操作的地方。 JAX-RS运行时将所有上下文信息与OutputStream一起传递给OutputStream ,从Java类型转换后,响应流可以写入到OutputStream
  • JAX-RS规范要求,对于某些Java类型(例如String,InputStream,File等),实现应包含MessageBodyWriter接口的现成实现。

好吧! 这是对服务器端请求处理如何在JAX-RS中工作以及哪些组件起作用的简要概述。 谢谢阅读。 干杯!

参考文献

  • JAX-RS规格文件
  • Java EE 7 API Java文档

翻译自: https://www.javacodegeeks.com/2015/01/jax-rs-2-0-server-side-processing-pipeline.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于TCP/IP的文件服务器编程一例

来源,华清远见嵌入式学院实验手册,代码来源:华清远见曾宏安 实现的功能: 编写TCP文件服务器和客户端。客户端可以上传和下载文件 客户端支持功能如下: 1.支持一下命令 help 显示客户端所有命令和说明 list 显示服务器…

【Linux系统基础】(2)在Linux上部署MySQL、RabbitMQ、ElasticSearch、Zookeeper、Kafka、NoSQL等各类软件

实战章节:在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面,我们学习了许多的Linux命令和高级技巧,这些知识点比较零散,同学们跟随着课程的内容进行练习虽然可以基础掌握这些命令和技巧的使用,…

JDK 7和JDK 8中大行读取速度较慢的原因

我之前发布了博客文章“使用JDK 7和JDK 8读取慢速行”,并且在该问题上有一些有用的评论来描述该问题。 这篇文章提供了更多解释,说明为何该文章中演示的文件读取(并由Ant的LineContainsRegExp使用 )在Java 7和Java 8中比在Java 6中…

Spring Stateless State Security第3部分:JWT +社会认证

我的Stateless Spring Security系列文章的第三部分也是最后一部分是关于将基于JWT令牌的身份验证与spring-social-security混合在一起的。 这篇文章直接建立在此基础上,并且主要集中在已更改的部分上。 想法是使用基于OAuth 2的“使用Facebook登录”功能来替换基于用…

nyoj239 月老的难题 二分图 匈牙利算法

月老的难题 时间限制:1000 ms | 内存限制:65535 KB难度:4描述月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘。 现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结…

Web应用程序体系结构– Spring MVC – AngularJs堆栈

Spring MVC和AngularJs共同为构建表单密集型Web应用程序提供了一个真正高效且吸引人的前端开发堆栈。在这篇博客文章中,我们将看到如何使用这些技术构建表单密集型Web应用程序,并将这种方法与其他方法进行比较可用选项。 可以在此github 存储库中找到功能…

antd Datepicker组件报错 ——date.clone is not a function或者date1.isAfter is not a function

问题描述: antd Datepicker组件报错 ——date.clone is not a function或者date1.isAfter is not a function 原因分析: 在From中渲染默认值,一般数据请求拿到返回值存在异步,会晚于渲染,因此日期转换不能放在DatePi…

集成CDI和WebSockets

考虑尝试一个简单的Java EE 7原型应用程序,该应用程序涉及JAX-RS(REST),WebSockets和CDI。 注意 :不想让它成为破坏者-但这篇文章主要讨论了我在尝试使用Web套接字和使用CDI作为“胶水”的REST(在Java EE应…

Java中连接字符串的最佳方法

最近有人问我这个问题–在Java中使用运算符连接字符串是否对性能不利? 这让我开始思考Java中连接字符串的不同方法,以及它们如何相互对抗。 这些是我要研究的方法: 使用运算符 使用StringBuilder 使用StringBuffer 使用String.concat() …

十大最常见的Java性能问题

Java性能是所有Java应用程序开发人员都关心的问题,因为快速使应用程序与使其正常运行同等重要。 史蒂文海恩斯(Steven Haines)使用他在Java性能问题上的个人经验得出的结论是, 大多数问题都有共同的根本原因 。 因此,作…

Unity3D 访问Access数据库

Unity3D 访问Access数据库 在开始这个小教程之前呢,其实在网上你已经可以找到相关的资料了,但是我还是要把我自己做练习的一点东西分享出来。写这个教程的主要原因呢,是一个朋友在u3d的官网论坛里,找到了这个demo,但是…

LaTeX 基础笔记。开篇

LaTeX 的起源非常牛逼,有一套书大家可能听说过《计算机程序设计艺术》,写了好几本。当然能在计算机方面写上艺术俩字的书恐怕不是我们一般人能读懂得东西了。他的作者在1976年准备写第二卷的时候发现计算机的排版非常难看,所以,为…

Java旧版不断发展

我最近偶然发现了JDK API的一个非常有趣的警告&#xff0c;即Class.getConstructors()方法。 它的方法签名是这样的&#xff1a; Constructor<?>[] getConstructors()有趣的是&#xff0c; Class.getConstructor(Class...)返回一个Constructor<T> &#xff0c;并…

带Lambda表达式的Apache Wicket

这是怎么回事&#xff1f; :) 我一直在从事一些项目&#xff0c;这些项目值得庆幸的是将Apache Wicket用于表示层。 我自然想到Java的8个lambda表达式如何与Wicket完美匹配。 而不仅仅是我&#xff0c; Wicket团队似乎已经在努力更改API&#xff0c;以为开箱即用的lambda提供支…

装饰者模式如何拯救了我的一天

在工作中&#xff0c;我正在处理庞大的Java代码库&#xff0c;该代码库是由许多不同的开发人员在15年的时间里开发的。 并不是所有的事情都由书来完成&#xff0c;但是同时我通常没有机会重构遇到的每一个奇怪之处。 尽管如此&#xff0c;仍可以每天采取提高代码质量的措施。 …

快速的骆驼和云消息传递

Apache Camel是一个流行的&#xff0c;成熟的开源集成库。 它实现了企业集成模式 &#xff0c;这是在集成分布式系统时经常出现的一组模式。 过去&#xff0c;我写过很多关于Camel的文章&#xff0c; 包括为什么我比Spring Integration更喜欢它 &#xff0c; 路由引擎 如何 工作…

三角形类1

/* 程序的版权和版本声明部分 Copyright (c)2012, 烟台大学计算机学院学生 All rightsreserved. 文件名称&#xff1a; object.cpp 作者&#xff1a;刘清远 完成日期&#xff1a; 2013年3月29日 版本号&#xff1a; v1.0 输入描述&#xff1a;无 问题描述&#xff1a;设计求三…

android 自定义xml属性

Android 自定义组件 Android 提供了非常精致的和非常强大的组件化模型&#xff0c;能够更加方便的构建UI,这些UI组件都是基于基本的layout类:View 和 ViewGroup。 部分能够用的widgets包括&#xff1a;Button&#xff0c;TextView,EditText,ListView,CheckBox&#xff0c;Radio…

LeetCode: Longest Common Prefix

string.erase没掌握好&#xff0c;悲了个剧&#xff0c;2次过 1 class Solution {2 public:3 string longestCommonPrefix(vector<string> &strs) {4 // Start typing your C/C solution below5 // DO NOT write int main() function6 s…

流式传输大数据:Storm,Spark和Samza

有许多分布式计算系统可以实时或近实时处理大数据。 本文将从对三个Apache框架的简短描述开始&#xff0c;并试图对它们之间的某些相似之处和不同之处提供一个快速的高级概述。 阿帕奇风暴 在风暴 &#xff0c;你设计要求的T opology实时计算的图&#xff0c;然后喂到集群&…