Jax-RS自定义异常处理

使用JEE的好处之一是可用的组件确实是非常标准的。 在使用JAX-RS时,有时您需要控制如何处理异常并将其反馈给用户。 默认情况下,如果引发异常,您将得到一些可怕的HTTP 500内部服务器异常,从而暴露Web服务的内部故障。

考虑以下要点,该端点将用于基于ID查看用户。

@Path("/users")
public interface UserWebService {@POST@Consumes({ MediaType.APPLICATION_JSON })@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })@Path("/{userId}")Response getUser(@PathParam("userId") String userId);
}

现在,该接口的实现类似于以下内容,以完成实际获取用户的驴工作。

public final class UserWebServiceImpl implements UserWebService {@EJB private UserDao userDao;public Response getUser(final String userId) {final User user = userDao.getUser(userId);return Response.ok().entity(user).build();}
}

看起来不错,但请考虑使用Query.getSingleResult来确定 userDao是否正在执行某些实体业务逻辑,并且不存在具有此ID的用户吗?

根据JEE6 API文档,您将收到一个NoResultException ,它将导致暴露内部服务器异常的HTTP 500错误,这绝对是最终用户不应该看到的。 我们需要利用Jax-RS的异常处理!

首先,我们需要一个笨拙的异常对象,适当命名,这将是我们实际抛出的对象,请考虑以下代码。

public class UserWebServiceException extends Exception implementsSerializable {private static final long serialVersionUID = 1169426381288170661L;public UserWebServiceException() {super();}public UserWebServiceException(String msg) {super(msg);}public UserWebServiceException(String msg, Exception e) {super(msg, e);}
}

接下来,我们需要修改原始代码以考虑到此异常,我在下面适当地修改了原始UserWebService和关联的实现。

@Path("/users")
public interface UserWebService {@POST@Consumes({ MediaType.APPLICATION_JSON })@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })@Path("/{userId}")Response getUser(@PathParam("userId") String userId) throws UserWebServiceException;
}
public final class UserWebServiceImpl implements UserWebService {@EJB private UserDao userDao;public Response getUser(final String userId) throws UserWebServiceException {try {final User user = userDao.getUser(userId);} catch(NoResultException e) {throw new UserWebServiceException("User does not exist with id " + userId);}return Response.ok().entity(user).build();}
}

现在,当找不到用户时,这将引发适当的异常。 但是,我们仍然需要创建一个Handler对象,以将该异常转换为实际的JSON响应,以便获得友好的错误消息。 下面的类处理此异常,并将异常中的错误消息转换为JSON响应。 您将在此类上看到的重要注释是@Provider注释。

@Provider
public final class UserWebServiceExceptionHandler implementsExceptionMapper<UserWebServiceException> {@Overridepublic Response toResponse(final UserWebServiceException exception) {return Response.status(Status.BAD_REQUEST).entity(new ErrorMessage(exception.getMessage())).type(MediaType.APPLICATION_JSON).build();}	
}

您会注意到我们创建了一个ErrorMessage对象来响应Web服务。 这只是一个简单的哑对象,用于保存将编入JSON的实际错误的详细信息。

public class ErrorMessage {private String error;public ErrorMessage(String error) {this.error = error;}public String getError() {return error;}
}

将异常处理程序提供程序映射到Web应用程序的最后一步是将以下内容添加到WebApp的web.xml中。

<context-param><param-name>resteasy.providers</param-name><param-value>uk.co.soa.rest.providers.UserWebServiceExceptionHandler</param-value>        
</context-param>

现在,当我们使用不存在的用户ID调用REST端点时(假设为“ DAG”),我们将很高兴收到以下JSON响应,而不是堆栈跟踪。

{"error": "User does not exist with id DAG"
}

翻译自: https://www.javacodegeeks.com/2014/05/jax-rs-custom-exception-handling.html

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

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

相关文章

开张大吉!

新工作&#xff0c;新技术&#xff0c;新开始&#xff01; 开这个博客&#xff0c;希望能记录自己在新公司的点点滴滴&#xff01; 转载于:https://www.cnblogs.com/newman78/archive/2008/05/14/1197227.html

html中评论应该怎么写,HTML-评论

HTML-评论注释是一段代码&#xff0c;任何网络浏览器都将忽略它。最好在HTML代码中添加注释&#xff0c;尤其是在复杂的文档中&#xff0c;以指示文档的各个部分&#xff0c;以及任何其他注释代码的人。注释可帮助您和其他人理解您的代码并提高代码的可读性。HTML注释位于标记之…

vue命令行错误处理

全局安装vue/cli时&#xff1a;npm install -g vue/cli &#xff08;1&#xff09;Error: EACCES: permission denied, access /usr/local/lib/node_modules/vue/cli 原因: 执行命令时没有获得管理员权限 解决办法: 在命令前面加上sudo即可.然后输入电脑的管理员密码操作即可…

RAC(ReactiveCocoa)介绍(一)

最近在学习RAC&#xff0c;之前在iOS工作中&#xff0c;类之间的传值&#xff0c;无非是block、delegate代理、KVO和Notification等这几种方法。在RAC中&#xff0c;同样具备替代block、delegate代理、KVO和Notification&#xff0c;UI target、定时器timer、数据结构等各种方式…

祖国啊

祖国啊&#xff0c;我们用鲜血供奉您...转载于:https://www.cnblogs.com/westsource/archive/2008/05/22/1204827.html

一段简单的html 5 音频,5个用于处理HTML5音频的库和API

在过去的几个月中&#xff0c;我遇到了许多不同的库&#xff0c;它们利用了相对较新的HTML5 Audio API以及更著名的HTML5 Audio Element及其更简单的API。我以为我会在本文中分享这些库中的一小部分&#xff0c;以向您展示如果选择创建需要操纵声音文件的游戏或应用程序&#x…

下载软件的好地方

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/转载于:https://www.cnblogs.com/pengzhi12345/p/11197510.html

用于JMX访问的Apache Ant任务

我想从Ant任务中调用JMX操作。 但是&#xff0c;找到可用的蚂蚁任务库及其用法非常棘手。 因此&#xff0c;让我分享我的经验&#xff0c;使他人更轻松。 JMX操作的Ant任务 我决定遵循Tomcat文档并使用与tomcat一起分发的ant任务。 仅作记录用途&#xff0c;并不限于Tomcat部…

async 和 await 之异步编程的学习

async修改一个方法&#xff0c;表示其为异步方法。而await表示等待一个异步任务的执行。js方面&#xff0c;在es7中开始得以支持&#xff1b;而.net在c#5.0开始支持。本文章将分别简单介绍他们在js和.net中的基本用法。 一、在js中的实现 js中的异步&#xff0c;还是基于Prom…

WinAPI: SetRect 及初始化矩形的几种办法

本例分别用五种办法初始化了同样的一个矩形, 运行效果图:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 class(TForm)Button1: TButton;Button2: TButton;Button3: TButton;Button4: TBu…

Eureka 集群高可用配置.

SERVER:1 server:port: 1111 eureka:instance:hostname: ${spring.cloud.client.ip-address}instance-id: ${eureka.instance.hostname}:${server.port}preferIpAddress: true #指定通过IP注册,一般服务集群时配置,需要ip-address参数一起设置(保证hostName和ip-address一…

备忘录——通过RVA计算文件位置

备忘录——通过RVA计算文件位置 原创&#xff1a;Anders Liu 摘要&#xff1a;本文介绍了如何通过PE文件中某一项的RVA来计算其在文件中的位置。 参考文献 ECMA-335——Common Language Infrastructure (CLI) 4th Edition, June 2006 范畴 该备忘录描述了在分析PE&#xff08;可…

使用Java 8的Builder模式

我在一个环境中工作&#xff0c;其中通过调用远程服务而不是使用数据库来执行大量日常脚本任务。 对于许多脚本编写任务&#xff0c;我经常使用Groovy&#xff0c;而Groovy专门用于该任务的最有用的功能之一就是它是用流畅的Builders构建的 。 现在&#xff0c;Groovy构建器利…

Asp.net2.0工具包AjaxControlToolkit下载和安装

Asp.net2.0工具包AjaxControlToolkit下载和安装:点击下载 环境设置如下&#xff1a;A!a.S-DQ0ITPUB个人空间P,JN2y2b o5K 下载完 ASPAJAXExtSetup.msi 安装更新后在你的系统盘下的&#xff08;以C盘为例&#xff09; 出现这个 文件夹&#xff1a;ITPUB个人空间nA*O2U/l8i69s#o0…

中后端管理系统前后分离、前端框架的实现拙见

一、实现思路 在实践中后台管理系统的前后端分离时&#xff0c;往往会因为业务量的增加使其前端项目难以维护&#xff0c;以及打包时间不理想&#xff0c;还有业务系统与框架之间区分不在明显。本文是本人从另一个角度提出的一种解决方案&#xff0c;希望各位提出宝贵的建议。…

初见mobX

先看如下的代码 const {observable} mobox; const {observer}mobxReact; const {Component}React; const appStateobservable({count:0 }) appState.incrementfunction(){this.count } appState.decrementfunction(){this.count-- } observer class Counter extends Component{…

html输入完账号密码才能跳转,HTML输入字段跳转

我有2个文本字段&#xff0c;用户名和密码。当我输入密码时&#xff0c;它跳到第一个。我不知道为什么会这样。我无法找到它为什么跳。如何更改密码表单不跳转&#xff1f;这里是代码&#xff1a;HTML输入字段跳转session_start();require_once database.php;if (isset($_SESSI…

让使用MSN就像访问网页一样容易!

有时候&#xff0c;你不得不佩服微软的想法&#xff01; http://webmessenger.msn.com/转载于:https://www.cnblogs.com/Hush/archive/2004/12/10/75430.html

学用状态机模式,写的报销流程,请指教

刚学编程不久&#xff0c;请前辈们指点。需求变化点&#xff1a;不同的金额&#xff0c;和不同的角色走不同的报销流程usingSystem;staticclassFactory { publicstaticEmployee CreateEmployee(stringname) { Employee employee null; switch(name) …

Java 8 Friday:更好的异常

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 Java 8星期五 每个星期五&#xff0c;我们都会向您展示一些不错的教程风格的Java 8新功能&#…