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

在最近的一些工作中,我收到了在发生错误时在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

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

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

相关文章

hdu 1251 统计难题(求前缀出现了多少次)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1251 #include <iostream> #include <cstring> #include <cstdio> #define mem(a,b) memset(a,b,sizeof(a)); using namespace std; typedef long long ll; const int maxn 500005; const l…

新浪微博后台服务器架构

http://www.slideshare.net/iso1600/high-performance-weibo-qcon-beijing-2011-7577912High Performance Weibo QCon Beijing 2011 View more presentations from Tim Y 转载于:https://www.cnblogs.com/inteliot/archive/2012/04/19/2457008.html

如何将商业第三方文物整合到您的Maven版本中

根据ZeroTurnaround的RebelLabs最近进行的一项调查 &#xff0c;Maven仍然是领先的Java构建平台。 根据RebelLabs&#xff0c;当前的市场份额分布是&#xff1a; Maven的64&#xff05; 蚂蚁常春藤与16.5&#xff05; 摇篮与11&#xff05; 但是&#xff0c;与此同时&#…

2012年4月18日 新的开始

博客原本写在 http://50.17.193.116/但是由于没有域名的关系,不能被大多的搜索引擎给搜索到,为了能更大的分享我个人的一部分学习经验,将我的blog同时在博客园同步更新. 今天将开始书写自己的Blog&#xff0c;感谢师太提供了50.17.193.116这样一个还行&#xff0c;能将就用用的…

Membership学习(三)Membership Providers介绍[xgluxv]

本来想在第三篇文章里介绍一下 Membership的类的&#xff0c;不过现在中文msdn也出来了&#xff0c;所以就不写了&#xff0c;&#xff0c;直接到介绍Membership Providers。 Membership Providers提供了Membership数据源和服务之间的所有接口&#xff0c;在Asp.net2.0中…

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

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

Servlet技术

----Servlet是用Java语言编写的应用到Web服务器端的扩展技术&#xff0c;它先于jsp产生&#xff0c;可以方便地对Web应用中的HTTP请求进行处理。在Java Web程序开发中&#xff0c;Servlet主要用于处理各种业务逻辑&#xff0c;他比jsp更具有业务逻辑层的意义。 一。Servlet基础…

Mysql远程登录及常用命令

第一招&#xff1a;mysql服务的启动和停止 启动&#xff1a;net start mysql 停止&#xff1a;net stop mysql 第二招&#xff1a;登陆mysql 语法如下&#xff1a;mysql -u用户名 -p用密码 键入命令mysql -uroot -p&#xff0c;回车后提示你输入密码&#xff0c;输入12345&…

基于Spring Boot的WebSocket应用程序并捕获HTTP会话ID

我最近参与了一个项目&#xff0c;我们需要捕获Websocket请求的http会话ID –原因是要确定使用相同基础HTTP会话的Websocket会话的数量。 这样做的方法基于利用新的spring-session模块的示例&#xff0c;并在此处进行描述。 捕获http会话ID的技巧是理解在浏览器和服务器之间建…

用过的jQuery记录

var list $(input:radio[name"name"]:checked).val();  //选择input中单选name为“name”的并且是选中状态的 index $(document).data(index);  //把参数存入document中保存起来并在下一次中取出再用index 1index $(document).data(index); str.find("input…

windows phone画板程序

前几天想要这样一个程序&#xff0c;没找到&#xff0c;今天上网偶然发现了&#xff0c;转载过来。 <Grid> <InkPresenter x:Name"MyPresenter" HorizontalAlignment"Left" VerticalAlignment"Top" MouseLeftButtonDown"MyP…

文件指针创建失败!File *fp失败

问题记录&#xff1a;项目是在所里边的vs2010上创建的&#xff0c;正常&#xff01;在自己的笔记本上使用vs13和19都一直报错&#xff01;指针一直为空&#xff01; 网上查了好久&#xff0c;试了很多方法都没有用&#xff01;最后发现是权限的问题&#xff0c;c盘下边创建不了…

前端开发:小程序--第一步

当我在接到小程序的项目的时候&#xff0c;几乎可以说是一脸懵因为对小程序的概念说实话是不太理解的&#xff0c;或者说理解的不太透彻&#xff0c;但是领导给项目说要完成&#xff0c;那没办法&#xff0c;还是要继续呀。 首先&#xff0c;我就想着先注册一个看看&#xff0…

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

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

【解决】insert 语句无效果,在查询中正常运行问题

今天碰到一个奇怪的问题&#xff0c;具体见csdn&#xff1a;http://topic.csdn.net/u/20120424/19/0aeacbce-a9d5-4630-8b87-a08d5df1828b.html?seed1347097422&r78358698#r_78358698 解决方法与原因:猜测&#xff0c; 因为数据库是我再vs2010中建立的&#xff0c;数据库版…

最近开始研究和关注的技术

留个草稿&#xff0c;慢慢补充。 Acropolis&#xff0c;基于WPF的应用程序框架&#xff0c;某种角度可以认为是CAB的WPF实现&#xff1b; http://windowsclient.net/acropolis/&#xff0c;Cider似乎还是不完善......不知道VS2008 Release时能不能妥善处理好WPF在设计期的渲染。…

html行级元素和块级元素以及css转换

之前有说过html的标签是有语义的&#xff0c;当然也就有一些默认的样式&#xff0c;比如标题有h1h6&#xff0c;他们的字体由大至小一次递减&#xff0c;字体比一般字体要加粗。 这样也就有了行级元素和块级元素&#xff0c;下面来看看什么是行级元素什么事块级元素&#xff1…

EasyCriteria已演变为uaiCriteria。 新名称和更多功能

你好&#xff01;你好吗&#xff1f; 我很高兴宣布uaiCriteria的发布&#xff0c;EasyCriteria的演进。 确实需要更改框架名称吗&#xff1f; 是的&#xff0c;可悲的是。 我找到了另一个具有相同名称的框架 &#xff0c;这就是为什么我决定更改名称的原因&#xff08;我不希…

ajax方式下载文件

在web项目中需要下载文件&#xff0c;由于传递的参数比较多&#xff08;通过参数在服务器端动态下载指定文件&#xff09;&#xff0c;所以希望使用post方式传递参数。通常&#xff0c;在web前端需要下载文件&#xff0c;都是通过指定<a>标签的href属性&#xff0c;访问服…

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

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