使用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

Jax-RS自定义异常处理相关推荐

  1. Spring Security 实战干货:自定义异常处理

    Spring Security 实战干货:自定义异常处理 转自:https://www.cnblogs.com/felordcn/p/12142514.html 文章目录 1. 前言 2. Sprin ...

  2. springboot自定义异常处理

    springboot自定义异常处理 参考文章: (1)springboot自定义异常处理 (2)https://www.cnblogs.com/SimpleWu/p/10044468.html 备忘一 ...

  3. 玩转springboot:自定义异常处理和深入异常处理原理

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了 3 个月总结的一线大厂 Java 面试总结,本 ...

  4. Web框架——Flask系列之abort函数与自定义异常处理(十三)

    一.abort函数 使用abort函数可以立即终止视图函数的执行,并可以返回给前端特定的信息 传递状态码信息,必须是标准的http状态码 abort(403) 传递响应体信息 resp = Respo ...

  5. ThinkPHP6项目基操(13.实战部分 项目中的自定义异常处理总结 错误页面API错误)

    项目中的自定义异常处理总结 错误页面&API错误 前言 一.异常分类 1. 控制器找不到 2. 方法找不到 3. 请求资源不存在 4. 系统內部异常.HTTP异常等 二.异常处理 1. 前置处 ...

  6. Springboot2 自定义异常处理

    开发过程中由于出现异常时想要返返回指定类型的json串,springboot自带的异常处理无法满足需求,自己封装异常处理类进行指定的异常处理. import java.util.HashMap; im ...

  7. ASP.NET AJAX入门系列(8):自定义异常处理

    在UpdatePanel控件异步更新时,如果有错误发生,默认情况下会弹出一个Alert对话框显示出错误信息,这对用户来说是不友好的,本文看一下如何在服务端和客户端脚本中自定义异常处理,翻译自官方文档. ...

  8. C++自定义异常处理

    C++自定义异常处理 参考文章: (1)C++自定义异常处理 (2)https://www.cnblogs.com/qinwanlin/p/5486061.html (3)https://www.co ...

  9. tp5 ThinkPHP5 自定义异常处理类

    tp5 ThinkPHP5 自定义异常处理类 参考文章: (1)tp5 ThinkPHP5 自定义异常处理类 (2)https://www.cnblogs.com/pyspang/p/11095414 ...

  10. 谷粒学院-统一异常处理(全局异常处理、特定异常处理、自定义异常处理)

    什么是统一异常处理 我们想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异 常处理 (一)全局异常处理 在service-base中创建exceptionhandler ...

最新文章

  1. 最小化安装linux CentOS-6.6后 部署fastdfs +下载地址 很干很干的干货
  2. python基础回顾
  3. 【RecyclerView】 十、RecyclerView 数据更新 ( 增加单条数据 | 批量增加数据 )
  4. 0109互联网新闻 | 微信推智言对话系统“小微”,接入第三方生态;华为发布首款数据中心交换机...
  5. Android 的 init.rc 文件简介【转】
  6. 2.2 基本算法之递归和自调用函数 8758 2的幂次方表示 python
  7. Exchange 2010 OWA更改过期密码
  8. Flash与组件:制作Slider组件
  9. C语言qsort和C++sort的用法小结和区别比较
  10. 最有价值的编程忠告[转CSDN]
  11. MFC总结之CListCtrl用法及技巧
  12. Unity Shader数学基础——矩阵
  13. AMD Ryzen Threadripper PRO 5000 series now available for the DIY market, 64 Zen3 cores for $6500
  14. Qt连接MySql驱动加载失败问题解决方法
  15. Python学习17(GUI图形用户界面编程)
  16. Spring Boot学习8——Redis
  17. enigma机的原理
  18. 1.2编程基础之变量定义、赋值及转换
  19. CondaUpgradeError: This environment has previously been operated on by a conda version that‘s newer
  20. 解决win10控制面板闪退问题

热门文章

  1. 2015蓝桥杯省赛---java---B---1(三角形面积)
  2. MySQL笔记汇总---狂神说
  3. 继承类对方法的影响java_4-Java面向对象-继承(上)
  4. 毕业设计word 表格标题 图表标题
  5. 手机app 服务器 网页同步,手机app接入云服务器
  6. java aop 实例_Spring aop 简单示例
  7. 已知两点坐标如何快速增加其他坐标_「测绘精选」坐标转换概述
  8. DFS应用——找出无向图的割点
  9. MVC如何添加Model
  10. osgi cxf_所有OSGi套件的通用CXF请求拦截器