jax-rs/jersey

在我最近的一些工作中,我收到了在发生错误时在HTTP状态响应中生成自定义“原因短语”的请求,并将其传递给使用我们REST API的客户端之一。 在这篇文章中,我将演示如何使用Jersey来实现这一目标。

1.定义检查的异常和异常映射器

正如您从我的文章REST API中使用Jersey进行错误处理中发现的那样,我喜欢使用Jersey的ExceptionMapper功能来处理已检查的异常 。

为了演示的目的,我定义了一个CustomReasonPhraseException

CustomReasonPhraseException

package org.codingpedia.demo.rest.errorhandling;public class CustomReasonPhraseException extends Exception {private static final long serialVersionUID = -271582074543512905L;private final int businessCode;public CustomReasonPhraseException(int businessCode, String message) {super(message);this.businessCode = businessCode;}public int getBusinessCode() {return businessCode;}}

CustomReasonPhraseExceptionMapper来处理映射到一个响应,如果CustomReasonPhraseException发生:

CustomReasonPhraseExceptionMapper

package org.codingpedia.demo.rest.errorhandling;import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;@Provider
public class CustomReasonPhraseExceptionMapper implements ExceptionMapper<CustomReasonPhraseException> {public Response toResponse(CustomReasonPhraseException bex) {return Response.status(new CustomReasonPhraseExceptionStatusType(Status.BAD_REQUEST)).entity("Custom Reason Phrase exception occured : " + bex.getMessage()).build();}}

提醒:当应用程序引发CustomReasonPhraseException ,将调用CustomReasonPhraseExceptionMapper实例的toResponse方法。

ExceptionMapper代码注释第12行中:

CustomReasonPhraseExceptionStatusType

return Response.status(new CustomReasonPhraseExceptionStatusType(Status.BAD_REQUEST))

在Jersey的ResponseBuilder您可以通过实现javax.ws.rs.core.Response.StatusType接口来定义自己的状态类型。

2.实现自定义StatusType

为了使它更具扩展性,我创建了AbstractStatusType类:

AbstractStatusType

package org.codingpedia.demo.rest.errorhandling;import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.Response.Status.Family;
import javax.ws.rs.core.Response.StatusType;/*** Class used to provide custom StatusTypes, especially for the the Reason Phrase that appears in the HTTP Status Response*/
public abstract class AbstractStatusType implements StatusType {public AbstractStatusType(final Family family, final int statusCode,final String reasonPhrase) {super();this.family = family;this.statusCode = statusCode;this.reasonPhrase = reasonPhrase;}protected AbstractStatusType(final Status status,final String reasonPhrase) {this(status.getFamily(), status.getStatusCode(), reasonPhrase);}@Overridepublic Family getFamily() { return family; }@Overridepublic String getReasonPhrase() { return reasonPhrase; }@Overridepublic int getStatusCode() { return statusCode; }private final Family family;private final int statusCode;private final String reasonPhrase;}

之后,我使用CustomReasonPhraseExceptionStatusType进行扩展,以在响应中提供所需的自定义Reason Phrase例如“自定义错误消息” ):

CustomReasonPhraseExceptionStatusType扩展了AbstractStatusType

package org.codingpedia.demo.rest.errorhandling;import javax.ws.rs.core.Response.Status;/*** Implementation of StatusType for CustomReasonPhraseException.* The Reason Phrase is set in this case to "Custom error message"*/
public class CustomReasonPhraseExceptionStatusType extends AbstractStatusType{private static final String CUSTOM_EXCEPTION_REASON_PHRASE = "Custom error message";public CustomReasonPhraseExceptionStatusType(Status httpStatus) {super(httpStatus, CUSTOM_EXCEPTION_REASON_PHRASE);}}

3.在HTTP状态响应中测试自定义原因短语

请求

请求示例

GET http://localhost:8888/demo-rest-jersey-spring/mocked-custom-reason-phrase-exception HTTP/1.1
Accept-Encoding: gzip,deflate
Host: localhost:8888
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

响应

瞧!

回应范例

HTTP/1.1 400 Custom error message
Content-Type: text/plain
Content-Length: 95
Server: Jetty(9.0.7.v20131107)Custom Reason Phrase exception occured : message attached to the Custom Reason Phrase Exception

自定义“原因短语”将按预期方式出现在响应中。

提示:如果您真的想学习如何在Java中设计和实现REST API,请阅读以下教程–借助Jersey和Spring在Java中进行REST API设计和实现

摘要

您已在本文中看到了要标记“特殊”错误时如何在HTTP状态响应中创建自定义原因短语。 当然,您也可以使用此机制为其他HTTP状态定义自己的“原因短语”。 实际上,您不应该滥用此原因短语功能,因为HTTP 1.1 rfc2616中的内容如下:

“ Status-Code元素是一个3位数的整数结果代码,用于尝试理解和满足请求。 这些代码已在第10节中完全定义。原因短语旨在简要说明状态代码。 状态码供自动机使用,原因短语供人类用户使用。 不需要客户检查或显示原因短语。” [1]

好,就是这样。 继续编码并继续共享编码知识。

翻译自: https://www.javacodegeeks.com/2014/10/custom-reason-phrase-in-http-status-error-message-response-with-jax-rs-jersey.html

jax-rs/jersey

jax-rs/jersey_使用JAX-RS(Jersey)的HTTP状态错误消息响应中的自定义原因短语相关推荐

  1. 使用JAX-RS(Jersey)的HTTP状态错误消息响应中的自定义原因短语

    在最近的一些工作中,我收到了在发生错误时在HTTP状态响应中生成自定义"原因短语"的请求,该状态短语传递给我们的一个REST API消耗客户端. 在这篇文章中,我将演示如何使用Je ...

  2. mysql rs.next_JDBC结果集rs.next()注意事项

    写在前面: 用JDBC从数据库中查询数据要用到结果集ResultSet,其中我们在获取结果的时候经常用到rs.next()方法来判断是否查询到了数据. 但是要特别注意,next()方法用一次,游标就往 ...

  3. RS Browser Forensics下载|RS Browser Forensics(浏览器提取恢复工具)破解版下载 v1.0

    点击下载来源:RS Browser Forensics下载|RS Browser Forensics(浏览器提取恢复工具)破解版下载 v1.0 RS Browser Forensics是一款十分便民的 ...

  4. 【RS码2】RS码的BM迭代译码原理详解及MATLAB实现(不使用MATLAB库函数-代码见CSDN同名资源)

    关注公号[逆向通信猿]更精彩!!! 理论基础 订阅<信道编码>专栏,首先查阅各子程序的详解 [有限域生成]本原多项式生成有限域的原理及MATLAB实现 [有限域除法]二元多项式除法电路原理 ...

  5. java web Jersey_使用CXF和Jersey框架来进行Java的WebService编程

    CXFCXF是在xfire的基础上实现的. 1)首先呢,还是包的问题,在http://cxf.apache.org/download.html这里可以下到最新版的CXF,当然,我用的是最新版的.接下来 ...

  6. Perl内置及特殊变量

    一.正则表达式特殊 变量: 1.$n:包含上次模式匹配的第n个子串 2.$&:前一次成功模式匹配的字符串 3.$`:前次匹配成功的子串之前的内容 4.$':前次匹配成功的子串之后的内容 5.$ ...

  7. php打包压缩下载多大,php多文件打包压缩下载简单示例

    调用php中内置扩展ZipArchive类可以进行文件压缩打包下载,(PHP 5>=5.2.0,PHP 7,PECL zip>=1.1.0) 调用php中内置扩展ZipArchive类可以 ...

  8. Kubernetes 进阶训练营 控制器

    控制器 前面我们一起学习了 Pod 的原理和一些基本使用,但是在实际使用的时候并不会直接使用 Pod,而是会使用各种控制器来满足我们的需求,Kubernetes 中运行了一系列控制器来确保集群的当前状 ...

  9. 编程基础---java Servlet 学习

    来源1 来源2 来源3 Servlet 为创建基于 web 的应用程序提供了基于组件.独立于平台的方法,可以不受 CGI 程序的性能限制.Servlet 有权限访问所有的 Java API,包括访问企 ...

最新文章

  1. gcc编译自定义头文件
  2. 前端一HTML:十:选择器
  3. Docker 微服务教程
  4. 1.1 计算机的发展
  5. Java多线程超详细总结
  6. 老男孩python21期作业_(禁闲聊)绘画讨论10个群第176期作业展示
  7. java线程池延期执行一次_Java使用者的延期执行
  8. LeetCode 141. 环形链表
  9. Spring MVC 登录拦截器
  10. Spring Boot教程(11) – 理解注解@ControllerAdvice
  11. CentOS 6.4下CDH4集群安装(1)
  12. 天线罩结构的基础知识
  13. 紫书刷题记录 UVa1572 自组合
  14. 用python写一个倒计时器
  15. 选择重新做程序员 作者:Pisces Lee
  16. ElasticSearch 倒排索引(Inverted Index)| 什么是倒排索引?
  17. 你应该学点哲学的20个理由:不为拥有深奥的思想,只为更好地生活
  18. Nginx 踩坑之405 not allow
  19. 食君之禄 忠君之事 奈何哉!
  20. 给我一个西门子plc采集大数据存储与分析方案

热门文章

  1. 牛客练习赛69C-旅行【结论,最大生成树】
  2. P1463-[POI2002][HAOI2007]反素数【约数,数论】
  3. 禁用Cookie后,Session怎么样使用
  4. tomcat7.0.42如何设置mysql数据库连接池
  5. 高级java必须清楚的概念:原子性、可见性、有序性
  6. 干货|基于 Spring Cloud 的微服务落地
  7. 漫画算法:无序数组排序后的最大相邻差值
  8. java实现遍历树形菜单方法——设计思路【含源代码】
  9. JS中用构造函数创建对象
  10. 2018蓝桥杯省赛---java---B---3(复数幂)