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

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

正如您可能从我的文章使用Jersey的REST API中的错误处理中发现的那样,我喜欢使用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)的HTTP状态错误消息响应中的自定义原因短语相关推荐

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

    jax-rs/jersey 在我最近的一些工作中,我收到了在发生错误时在HTTP状态响应中生成自定义"原因短语"的请求,并将其传递给使用我们REST API的客户端之一. 在这篇文 ...

  2. linux显示fio为非法指令,FORTRAN运行错误消息列表中英对照.doc

    FORTRAN运行错误消息列表中英对照 Fortran的运行时错误消息列表 本节列出了英特尔Fortran运行时库(RTL)处理的错误.对于每一个错误,该表提供了错误号,严重性代码,错误信息文本,条件 ...

  3. mysql 不显示消息错误_如何编写不吸的错误消息

    mysql 不显示消息错误 by Justin Fuller 贾斯汀·富勒(Justin Fuller) 如何编写不吸的错误消息 (How To Write Error Messages That D ...

  4. iis php报错无法屏蔽,php屏蔽错误消息

    定义和用法: error_reporting() 设置 PHP 的报错级别并返回当前级别. 函数语法: error_reporting(report_level) 如果参数 level 未指定,当前报 ...

  5. Openstack虚机实例状态错误手工恢复vm_state:error

    Openstack虚机实例状态错误手工恢复vm_state:error Openstack虚机实例状态错误手工恢复vm_state:error 1.找到状态为出错状态的VM.在数据库里面表现Statu ...

  6. nlv sqlserver_未能使用提供程序“DataProtectionConfigurationProvider”进行解密。提供程序返回错误消息为: 该项不适于在指定状态下使用...

    hishop访问报错未能使用提供程序"DataProtectionConfigurationProvider"进行解密.提供程序返回错误消息为: 该项不适于在指定状态下使用, 您可 ...

  7. Xftp上传文件显示状态错误

    遇到问题: 我在本地使用 Xftp 向远程 Linux 服务器上传文件时,显示状态 "错误",经过上网查询说,需要 Xshell 使用 root 用户远程登录才可以传输文件. 问题 ...

  8. 虚拟机状态错误_学会这3招,分分钟迁移业务繁忙虚拟机!

    Writer:Cgm醉里挑灯写bug: 热爱旅游和美食. 一.背 景迁移一台内存密集型实例时,由于写内存的速度较快,脏页产生的速度一直比迁移虚拟机机,源目的虚拟机同步内存速度快,导致迁移一直完不成,结 ...

  9. 【C++编程语言】严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C3848 具有类型“const MyCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool

    问题描述:把set容器的内置排序算法改变时,使用仿函数 但是出现了一下错误 修改前 //set容器排序 class MyCompare {public:bool operator()( int v1, ...

最新文章

  1. LoadRunner中log的使用总结
  2. html5 如何实现客户端验证上传文件的大小
  3. Jupyter Notebook 快捷键 和 Markdown知识点总结
  4. 浙江省计算机二级excel函数,浙江省计算机二级excel练习5操作要求
  5. JavaScript 中的函数介绍
  6. linux iostat来对linux硬盘IO性能进行了解
  7. leetcodepython_LeetCode 答案(python)1-17
  8. 一位区域销售经理百条经验手记
  9. 提取小米主题内部的桌面锁屏壁纸图片步骤
  10. 网络基础之TCP/IP五层模型
  11. Charles安装破解和基础配置
  12. 坚果pro android版本,坚果pro升级安卓10 更新系统Smartisan OSv7.5.0
  13. 六月份阶段性大总结之Doris/Clickhouse/Hudi一网打尽
  14. 苹果原生二维码生成与扫描及生成的二维码不清楚的解决方案
  15. 全志H6 Android 7.0 平台 修改横竖屏显示
  16. 矢量科研数据质量检查方法
  17. Java TreeMap的使用
  18. Android设置控件背景颜色
  19. 硬件描述语言VHDL之并行语句基本使用介绍
  20. 树莓派 | Linux 中怎么查看图片

热门文章

  1. 银行营业网点管理系统——dao包(BranchesDao)
  2. 2019蓝桥杯省赛---java---C---1(求和)
  3. bean交个spring和new比较区别
  4. java 单一职责原则_设计模式之单一职责原则
  5. ajax调用后台java类_ajax调用java后台方法是什么
  6. wordcloud python3.7_[原创]win7/64位系统+python3.7.2下安装wordcloud库失败之解决——一个莫名其妙的方法...
  7. URLConnection-URL连接
  8. java计算混淆矩阵(分类指标:查准率P,查全率R,P和R的调和均值F1,正确率A)
  9. 实现滚到div时淡入效果
  10. vaadin_Vaadin提示:延迟加载和商品标识