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

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

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

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

相关文章

linux内核3.14.4,Linux内核4.14.14,4.9.77,4.4.112和3.18.92更新发布

原标题&#xff1a;Linux内核4.14.14&#xff0c;4.9.77&#xff0c;4.4.112和3.18.92更新发布导读正如所承诺的&#xff0c;Linux内核维护者Greg Kroah-Hartman今天发布了针对长期支持的Linux 4.14,4.9,4.4和3.18内核系列的一系列新更新。这些新内核在他们之前发布的一个星期后…

springboot 获取登录浏览器_java项目部署到linux服务器,微信小程序后台springboot项目部署到云服务器(图文详解)...

前面给大家讲了一个点餐系统的开发&#xff0c;包括java点餐后台和微信点餐小程序。可是都是教大家如何在本地把项目跑起来。今天就来教大家如何把这个点餐系统部署到服务器&#xff0c;实现商用。传送门点餐系统的开发&#xff0c;java后台微信小程序&#xff1a;https://blog…

spring体系结构_了解Spring Web应用程序体系结构:经典方法

spring体系结构每个开发人员必须了解两件事&#xff1a; 架构设计是必要的。 花哨的体系结构图没有描述应用程序的真实体系结构。 真正的体系结构是从开发人员编写的代码中找到的&#xff0c;如果不设计应用程序的体系结构&#xff0c;最终将得到一个具有多个体系结构的应用…

C 网络库都干了什么?

虽然市面上已经有很多成熟的网络库&#xff0c;但是编写一个自己的网络库依然让我获益匪浅&#xff0c;这篇文章主要包含&#xff1a;TCP 网络库都干了些什么&#xff1f;编写时需要注意哪些问题&#xff1f;CppNet 是如何解决的。首先&#xff0c;大家都知道操作系统原生的soc…

linux脚本登录启动失败,linux – 在X上运行shell脚本失败登录尝试

Alrighty.我想到了.要小心不要搞砸,因为如果你做错了,可能会搞砸你的系统.如果您对此感到不舒服,最好先在虚拟机中进行尝试.教程>创建脚本.在本教程中,我将把脚本放在/var/myscript.sh中.您可以安全地将脚本路径替换为脚本所在的位置.在任何情况下,请确保脚本不会以0以外的任…

iphone屏幕录制_iPhone怎么内录声音?怎么录制苹果手机内部声音?

有时我们想要对苹果手机上播放的声音进行录音&#xff0c;却不知道该如何操作。苹果手机上自带的录音软件只可以对手机外部声音进行录制&#xff0c;却无法录制自身播放的声音。其实我们可以先将苹果手机屏幕及声音先投放到电脑上&#xff0c;再通过支持内录的软件进行录音就可…

docker 部署java_使用Java EE 7,WildFly和Docker进行持续部署–(第1部分)

docker 部署java此博客是开始一个新的hanginar&#xff08;G 结伴旅游 webi NAR&#xff09;&#xff0c;将突出解决方案&#xff0c;框架&#xff0c;应用服务器&#xff0c;工具&#xff0c;部署和更多的内容集中在Java EE的系列。 这些不是通常的会议风格独白演示&#xff…

C 中命名空间的五大常见用法

译者注&#xff1a;可能很多程序员对C 已经非常熟悉&#xff0c;但是对命名空间经常使用到的地方还不是很明白&#xff0c;这篇文章就针对命名空间这一块做了一个叙述。命名空间在1995年被引入到 c 标准中&#xff0c;通常是这样定义的:命名空间定义了新的作用域。它们提供了一…

linux 脚本 提示编辑器,javascript – 带脚本的文本编辑器…适用于Linux

所有主要的开源编辑器和大多数其他编辑器都有一些描述的脚本设施 – 有些(特别是Emacs)因此而闻名.唯一不像pico.那样非常轻量级的那些vim有一个native scripting language,也可以用嵌入式Python, Tcl或Perl interpreters构建,可以通过插件机制对选择,缓冲等进行操作. Emacs是关…

英伟达TX2烧录系统_英伟达的DPU,是想在数据中心奇袭英特尔?

热点追踪 / 深度探讨 / 实地探访 / 商务合作最近几年&#xff0c;经常关注科技圈的朋友们总会发现&#xff0c;每次遇到厂商有重大发布&#xff0c;就总能看到“颠覆”、“极致”、“革命性”等概念出现在发布会上。上周&#xff0c;iPhone12的发布现场&#xff0c;蒂姆库克就用…

代码jit_但这是不可能的,或者无法发现JIT破坏了您的代码。

代码jit时不时地查看一些代码&#xff0c;并认为它不可能是错误的。 一旦排除了简单的程序员搞砸代码/代码中的敌对行为&#xff08;确保您阅读Java Puzzlers或类似内容&#xff09;或并发性问题&#xff08;阅读Java并发性或继续学习Heniz博士的出色课程 &#xff09;&#xf…

C vector详解

【导读】&#xff1a;vector是一个封装了动态大小数组的顺序容器&#xff08;Sequence Container&#xff09;。跟任意其它类型容器一样&#xff0c;它能够存放各种类型的对象。可以简单的认为&#xff0c;vector是一个能够存放任意类型的动态数组。接下来&#xff0c;请跟随小…

Linux共享文件夹中毒,linux服务器中毒利用Find查找病毒例子

网上流行在用的特征码是&#xff1a;(PS&#xff1a;不过一定有遗留)后门特征->cha88.cn后门特征->c99shell后门特征->phpspy后门特征->Scanners后门特征->cmd.php后门特征->str_rot13后门特征->webshell后门特征->EgY_SpIdEr后门特征->tools88.com…

arcgis 出图背景_ArcGIS空间制图分析视频教程(二狮兄出品)含ArcMap

这套教程是二狮兄出的一套ArcGIS地理空间制图数据分析视频教程&#xff0c;含ArcMap/ArcCatalog部分。教程分为上中下三部&#xff0c;已全部录制完毕&#xff0c;全部课程120节。适用人群ArcGIS目前的应用范围非常广泛&#xff0c;包括但不限于从事地理景观、生态环境、规划设…

spring bean依赖_Spring @Configuration并将bean依赖项作为方法参数注入

spring bean依赖一个春天建议注射豆从Spring的参考指南复制下面的示例中显示之间的相互依存关系的方式在这里 &#xff1a; Configuration public class AppConfig {Beanpublic Foo foo() {return new Foo(bar());}Beanpublic Bar bar() {return new Bar("bar1");}}…

C 之父:C 的成功属于意料之外,C 11是转折点

C 的起源可以追溯到 40 年前&#xff0c;但它仍然是当今使用最广泛的编程语言之一。到 2020 年 9 月为止&#xff0c;C 是仅次于 C 语言、Java 和 Python&#xff0c;位于全球第四的编程语言。根据最新的 TIOBE 索引&#xff0c;C 也是增长最快的语言。近日&#xff0c;C 之父 …

aix磁盘挂载到linux,AIX下文件系统挂载点相互调换方案

由于业务发展的需要&#xff0c;企业在异地实现了数据块级的灾备&#xff0c;由于原来的备份目录lv所在VG恰好在远程灾备VG内(该方案实现的是vg级别的数据同步)&#xff0c;为了节省带宽所以又从存储上新划分出一块磁盘新建了一个vg作为备份空间使用。但是由于当时厂商在创建vg…

苹果几最好用_深度解析安卓手机和苹果手机到底有哪些区别,哪种手机最好用...

"安卓阵营手机和苹果手机一直是手机界多年的竞争对手。由于安卓系统是开源的系统&#xff0c;任何厂家都能使用它。而导致安卓系统全球碎片化的主要原因是大部分国产品牌手机都没有安装谷歌服务&#xff0c;对于外国人的来说安装了谷歌服务的安卓手机才是完整的。然而中国…

u3d ab包 循环依赖_为什么要保持软件包依赖项自由循环的五个原因

u3d ab包 循环依赖如果您很不幸不能在一个项目中与我一起工作&#xff0c;那么您将遭受所有软件包依赖项必须无循环的规则的困扰。 我不仅需要这样做 &#xff0c;而且还将创建一个单元测试&#xff0c;以确保使用Degraph进行测试。 这就是我认为无周期封装结构对项目有益的原因…

linux设置基础软件仓库时,安装centos系统时设置基础软件仓库出错

安装centos系统时设置基础软件仓库出错,公钥,命令,视频教程,器上,提示安装centos系统时设置基础软件仓库出错易采站长站&#xff0c;站长之家为您整理了安装centos系统时设置基础软件仓库出错的相关内容。1、首先登录CentOS服务器&#xff0c;连接上服务器之后我们使用yum remo…