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

礼貌– 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 –可以帮助在自定义域类的实例变量上使用上述所有与注入相关的注释,而不是使用这些注释将值注入各个方法参数

请求拦截器(链)

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

  • 拦截器有助于在处理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批注可用于确定多个过滤器(顺序链)的执行顺序。

响应拦截器(链)

  • 仅当注册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

JAX-RS 2.0:服务器端处理管道相关推荐

  1. input发送a.jax_JAX-RS 2.0:服务器端处理管道

    input发送a.jax 这篇文章的灵感来自JAX-RS 2.0规范文档 (附录C)中的Processing Pipeline部分. 我喜欢它的原因在于它提供了JAX-RS中所有模块的漂亮快照-以准备 ...

  2. ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事

    ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事 原文:ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事 本文通过一张GIF动图来继续聊一下ASP.NET Core ...

  3. jax rs mysql_JAX-RS示例(Jersey)

    我们可以通过 jersey 实现创建JAX-RS示例. 为此,需要加载 jersey相关jar文件或使用Maven框架. 在这个例子中,我们使用jersey jar文件来实现JAX-RS jersey ...

  4. ASP.NET Core 1.0中的管道-中间件模式

    ASP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middleware)的方式注册在管道中.显而易见这样的设计非常松耦合 ...

  5. jax rs mysql_liferay7-rest开发JAX-RS规范详解

    简介 JAX-RS (JSR-311) 是为 Java EE 环境下的 RESTful 服务能力提供的一种规范.它能提供对传统的基于 SOAP 的 Web 服务的一种可行替代. 在本文中,了解 JAX ...

  6. jax rs mysql_Jersey / JAX-RS ExceptionMapper MySQL

    我正在学习Jersey / JAX-RS,我需要一些ExceptionMapper的帮助 . 我有一个UserFacade类,AbstractFacade类和User类本身,都非常标准,主要是通过在N ...

  7. oracle安装问题--未找到11.2.0服务器端

    **解决办法:**将oracle服务器端及客户端解压到同一目录下

  8. 动手做ASP.NET 2.0服务器端控件——AutoCheckTreeView(二)接口设计

    感谢谭振林先生所著<道不远人--深入解析ASP.NET 2.0控件开发> 讨论完了功能,我们来思考一下这个控件应该怎么设计. 1,给控件取个名字吧,因为一开始小凡只是考虑了自动勾选功能,所 ...

  9. Osmosis 0.46详细使用说明

    原文地址:http://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage_0.46 #全局选项 Short Option Long Option D ...

最新文章

  1. db2查看表结构_作为后端开发如何设计数据库系列文章(一)设计传统系统表结构(Java开发)...
  2. C++求最小公倍數LCM的实现算法(附完整源码)
  3. 入门机器学习,就这么简单!
  4. web——Tomcat Maven插件及Servlet入门
  5. 内存泄露Lowmemorykiller分析
  6. UIPickerView 选取器(滚轮)—IOS开发
  7. 通信原理实验(〇):音频信号的播放蒙特卡洛模拟
  8. 最短路 Dijkstra 算法详解与模板
  9. 对主机或 Docker 镜像进行漏洞扫描
  10. 具体案例 快速原型模型_【复习资料】软件工程之快速原型模型
  11. 如何在excel中单独冻结多行或多列
  12. Android 字体自适应屏幕的方法
  13. 十进制转换为三进制实例
  14. SSM整合(idear)
  15. 云计算大数据中心(清明作业)
  16. ICC 图文学习——LAB3:Placement 布局
  17. 角谷定理python_递归算法实现角谷定理
  18. oralce的clob类型数据操作
  19. 海鲜吃得好,喝酒少不了,盒马痛风套餐来了
  20. 从一个服务器拷贝文件到另一个服务器,从一台服务器上拷贝到另一台服务器

热门文章

  1. jdk的安装与环境变量的配置
  2. 分治算法---汉诺塔
  3. 【3】flink sink
  4. java作为kafka生产者实验及Expiring超时问题解决
  5. HDU2068(错列排序)
  6. Properties类与IO流
  7. java jdk设置字符集_使用JDK 11在Java字符串上的新方法
  8. JDK 15中的确切绝对整数
  9. www.how2j.com_HOW-TO:快速开始使用Spring 4.0,以构建简单的REST-Like API(演练)
  10. JDK 11:Java序列化的终结开始了吗?