resteasy 统一异常

在开发软件应用程序时,异常处理是显而易见的要求。 如果在处理用户请求时发生任何错误,我们应该向用户显示一个错误页面,其中包含详细的异常消息,错误代码(可选),更正输入和重试的提示(可选)以及实际根本原因(可选)等详细信息。 这也适用于RESTful Web服务。

但是,将try-catch-finally块放在所有代码中并不是一个好习惯。 我们应该以这样的方式设计/编码:如果发生任何不可恢复的错误,那么代码应该抛出该异常,并且应该有一个异常处理程序来捕获这些异常并提取错误详细信息,并对所有错误给出正确的错误响应错误详细信息。

RESTEasy提供了这样的ExceptionHandler机制,该机制简化了ExceptionHandling过程。

在这一部分中,我将向您展示如何使用RESTEasy的ExceptionHandlers处理异常。

步骤#1:创建应用程序特定的异常。

*** ResourceNotFoundException.java*package com.sivalabs.resteasydemo;public class ResourceNotFoundException extends RuntimeException{private static final long serialVersionUID = 1L;public ResourceNotFoundException(String msg){super(msg);}}*** ApplicationException.java*package com.sivalabs.resteasydemo;import java.io.PrintWriter;import java.io.StringWriter;public class ApplicationException extends RuntimeException{private static final long serialVersionUID = 1L;public ApplicationException(){super();}public ApplicationException(String message, Throwable cause){super(message, cause);}public ApplicationException(Throwable cause){super(cause);}public ApplicationException(String msg){super(msg);}public String getInternalErrorMessage(){Throwable cause = this.getCause();if(cause != null){StringWriter sw = new StringWriter();PrintWriter pw = new PrintWriter(sw);cause.printStackTrace(pw);return sw.toString();}return null;}}

步骤2:通过实现ExceptionMapper接口创建ExceptionHandlers。

*** ResourceNotFoundExceptionHandler.java*package com.sivalabs.resteasydemo;import javax.ws.rs.core.Response;import javax.ws.rs.ext.ExceptionMapper;import javax.ws.rs.ext.Provider;import org.springframework.stereotype.Component;@Provider@Componentpublic class ResourceNotFoundExceptionHandler implements ExceptionMapper<ResourceNotFoundException>{@Overridepublic Response toResponse(ResourceNotFoundException ex)For simplicity I am preparing error xml by hand.Ideally we should create an ErrorResponse class to hold the error info.String msg = ex.getMessage();StringBuilder response = new StringBuilder('<response>');response.append('<status>failed<status>');response.append('<message>'+msg+'<message>');response.append('<response>');return Response.serverError().entity(response.toString()).build();}}*** ApplicationExceptionHandler.java*package com.sivalabs.resteasydemo;import javax.ws.rs.core.Response;import javax.ws.rs.ext.ExceptionMapper;import javax.ws.rs.ext.Provider;import org.springframework.stereotype.Component;@Provider@Componentpublic class ApplicationExceptionHandler implements ExceptionMapper<ApplicationException>{@Overridepublic Response toResponse(ApplicationException ex){For simplicity I am preparing error xml by hand.Ideally we should create an ErrorResponse class to hold the error info.String msg = ex.getMessage();String internalError = ex.getInternalErrorMessage();StringBuilder response = new StringBuilder('<response>');response.append('<status>failed<status>');response.append('<message>'+msg+'<message>');response.append('<internalError>'+internalError+'<internalError>');response.append('<response>');return Response.serverError().entity(response.toString()).build();}}

步骤#3:更新UserResource.getUserXMLById()方法以验证用户输入并引发相应的异常

@Path('{id}')@GETpublic Response getUserXMLById(@PathParam('id') Integer id) {if(id==null || id < 1 ){throw new ApplicationException('User Id['+id+'] should not be less than 1.');}User user = userService.getById(id);if(user==null ){throw new ResourceNotFoundException('No User found with Id :['+id+']');}return Response.ok(user).build();}

步骤#4:通过发出以下请求来测试UserResource.getUserXMLById()服务方法。

case 1 : GET http:localhost:8080resteasy-demorestusers0Response :<response><status>failed<status><message>User Id[0] should not be less than 1.<message><internalError>null<internalError><response>case 2: GET http:localhost:8080resteasy-demorestusers100Response :<response><status>failed<status><message>No User found with Id :[100]<message><response>

重要注意事项:

在Spring创建必要的对象时,我们应该让Spring知道@Provider类,以使它们在RESTEasy中注册。 我们可以通过两种方式做到这一点。

a)使用@Component注释提供程序类

b)使用组件扫描的包含过滤器。
<context:component-scan base-package ='com.sivalabs.springdemo'>
<context:include-filter expression ='javax.ws.rs.ext.Provider'type ='annotation'/> </ context:component-scan>

RESTEasy教程系列

RESTEasy教程第1部分:基础

RESTEasy教程第2部分:Spring集成

RESTEasy教程第3部分–异常处理

参考: RESTEasy教程第3部分–来自我们的JCG合作伙伴 Siva Reddy的“ 异常处理” ,位于“ 我的实验在技术”博客上。

翻译自: https://www.javacodegeeks.com/2012/06/resteasy-tutorial-part-3-exception.html

resteasy 统一异常

resteasy 统一异常_RESTEasy教程第3部分:异常处理相关推荐

  1. SpringBoot:统一异常、数据校验处理

    本文转自:blog.lqdev.cn/2018/07/20/springboot/chapter-eight/ 前言 在web应用中,请求处理时,出现异常是非常常见的.所以当应用出现各类异常时,进行异 ...

  2. 使用Spring进行统一日志管理 + 统一异常管理

    统一日志和异常管理配置好后,SSH项目中,代码以往散落的log.info() 和 try..catch..finally 再也不见踪影! 统一日志异常实现类: [java] view plaincop ...

  3. Java项目构建基础:统一结果,统一异常,统一日志(好文推荐)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:永动的图灵机 juejin.im/post/5e073980 ...

  4. Windows Android SDK下载安装,配置,异常问题解决教程

    Windows Android SDK下载安装,配置,异常问题解决教程 参考文章: (1)Windows Android SDK下载安装,配置,异常问题解决教程 (2)https://www.cnbl ...

  5. Java项目构建基础:统一结果,统一异常,统一日志

    统一结果返回 目前的前后端开发大部分数据的传输格式都是json,因此定义一个统一规范的数据格式有利于前后端的交互与UI的展示. 统一结果的一般形式 是否响应成功: 响应状态码: 状态码描述: 响应数据 ...

  6. delphi自定义统一基础设置_Java项目构建基础:统一结果,统一异常,统一日志...

    作者:永动的图灵机 juejin.im/post/5e073980f265da33f8653f2e 统一结果返回 目前的前后端开发大部分数据的传输格式都是json,因此定义一个统一规范的数据格式有利于 ...

  7. 【SpringBoot】Http请求统一异常(返回数据)处理与单元测试

    对返回数据格式的统一 首先规定一下错误的输出格式: { "code": 1,"msg": "提示","data": nu ...

  8. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  9. SpringBoot - 统一格式封装及高阶全局异常处理

    文章目录 Pre 演进过程 版本V1 版本2 Step1 约定统一返回格式 Step2 开发统一返回对象 Step3 约定接口状态码 Step4 验证 Step5 完善全局异常处理 @RestCont ...

最新文章

  1. 这玩意比ThreadLocal叼多了,吓得我赶紧分享出来。
  2. Python 之 Matplotlib (四)图例
  3. HTTP协议处理流程
  4. sqli-labs(十三)(hpp)
  5. 怎样才能到国外做博士后
  6. python 读取文件
  7. Python-MongoDB的驱动安装、升级
  8. Spring框架概述(快速入门)
  9. 求幂级数展开的部分和 (20 分)新鲜出炉!!!
  10. erp系统是什么系统软件
  11. 如何注册Spring Bean
  12. 19.深入浅出:正弦波振荡电路——参考《模拟电子技术基础》清华大学华成英主讲
  13. 2020 CSP-S第二轮认证一等奖获奖名单
  14. ARM汇编中^、!、cxsf符号和movs等指令使用
  15. ins服务器未响应,Ins注册及登陆问题简明教程
  16. TOM企业邮箱,为你打造企业专属邮箱
  17. MPCS-314 1A 光电耦合器 用于IGBT/MOSFET隔离栅极驱动 完美代替ELS3150 亿光
  18. C#进阶系列——使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)
  19. 力扣383.赎金信(java语言散列表法)
  20. 深入理解操作系统实验——bomb lab(phase_6)

热门文章

  1. (十)Spring 与 MVC 框架整合
  2. Vue父组件使用子组件时,需要携带参数,函数内如何获取子组件给的值
  3. 第四章使用jQuery操作DOM元素
  4. javaWeb服务详解(含源代码,测试通过,注释) ——Dept的Dao层
  5. 图的广度优先算法+遍历
  6. Linux中安装nc(netcat)常见问题
  7. 单片机中存储器扩展位地址线怎么算_51单片机存储器小结
  8. mysql自动插入的时间不对 差8小时
  9. AVL树的单双旋转解析
  10. 正则表达式总结之查找