IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring Boot REST API错误如何改进 -> 正文阅读

[Java知识库]Spring Boot REST API错误如何改进

导读

Spring Boot提供了优秀的异常处理机制。ErrorController的默认实现能够很好地捕获和处理异常。此外,还可以自己实现@ExceptionHandler捕获和处理特定异常。然而,这里还有可以改进的空间:·?即使采用了自定义@ExceptionHandler实现某些异常还是会漏网,这时ErrorController会进行处理。@ExceptionHandler与ErrorController的方案可以改进。

·??默认错误有时候看起来比较混乱:? ?

{  "timestamp": "2018-09-23T15:05:32.681+0000",  "status": 400,  "error": "Bad Request",  "errors": [    {      "codes": [        "NotBlank.dto.name",        "NotBlank.name",        "NotBlank.java.lang.String",        "NotBlank"      ],      "arguments": [        {          "codes": [            "dto.name",            "name"          ],          "arguments": null,          "defaultMessage": "name",          "code": "name"        }      ],      "defaultMessage": "{name.not_blank}",      "objectName": "dto",      "field": "name",      "rejectedValue": null,      "bindingFailure": false,      "code": "NotBlank"    }  ],  "message": "Validation failed for object="dto". Error count: 1",  "path": "/"}

当然,我们可以注册自定义ErrorAttributes达成这一点,但是如果默认错误实现改进一下岂不更好。·??对于验证产生的错误,可以把约束条件中的某些参数开放给信息显示。比如可以使用{}占位符把int最小值传给消息显示。但是这种方式并不适用其它异常处理:? ?

public class UserAlreadyExistsException extends RuntimeException {    // How can I expose this value to the interpolated message?    private final String username;    // constructors and getters and setters}		

·? 如果所有异常都支持应用级的内置错误码当然是极好的。有时候,只有HTTP状态码根本无法定位问题。比如同一个EndPoint发生了不同的错误,报告了同一个状态码该如何分析?

改进方案

errors-spring-boot-starter为各种异常提供了统一处理。errors-spring-boot-starter在Spring Boot异常处理机制基础上提供了:·? 所有异常处理实现一致:不论是验证或绑定错误、domain错误、甚至Spring相关的错误都没有问题。所有异常都交由WebErrorHandler实现处理(不再需要ErrorController与@ExceptionHandler)·??内建支持应用级错误码。·??使用MessageSource进行简单的信息插入。·??支持HTTP错误码自定义显示。·??允许异常参数暴露给错误消息使用。

默认错误显示

错误的默认格式为JSON,schema定义如下:? ?

// errors数组为每个错误都定义了code/messsge组合{  "errors": [    {      "code": "first_error_code",      "message": "1st error message"    }  ]}

自定义显示只要注册HttpErrorAttributesAdapter实现一个Spring Bean。?

统一错误处理

所有异常都交给WebErrorHandler处理。Starter 默认会查询内建WebErrorHandler处理以下异常:·? 所有验证或绑定异常。·??所有带@ExceptionMapping注解的自定义异常。·??Spring MVC异常。·??Spring Security如果在classpath中也会处理。也可以实现WebErrorHandler注册一个自定义异常处理Spring Bean。

内建错误码支持

尽管RESTful?API推荐使用HTTP状态代码,但有时我们需要更多信息定位问题。这时候就需要使用错误码。可以把错误代码看成可读性更好的错误描述机器码。每个异常可以映射至少一个错误码。exception-to-error-code根据不同的异常类型有所差别:·??验证产生的错误码从注解中message属性提取,例如@NotBlank(message = "name.required")。·??@ExceptionMapping注解中的errorCode属性看起来像下面这样:? ?

@ExceptionMapping(statusCode = BAD_REQUEST, errorCode = "user.already_exists")public class UserAlreadyExistsException extends RuntimeException {}

·??下面是WebErrorHandler自定义实现:? ?

public class ExistedUserHandler implements WebErrorHandler {    @Override    public boolean canHandle(Throwable exception) {        return exception instanceof UserAlreadyExistsException;    }    @Override    public HandledException handle(Throwable exception) {        return new HandledException("user.already_exists", BAD_REQUEST, null);    }}

暴露参数

与Spring Boot一样,你也可以通过注解传递验证参数,例如用@Min(value = 18, message = "age.min")把参数内插到显示的消息中:

age.min = The minimum age is {0}!

此外,还可以使用@ExposeAsArg注解自定义异常。例如,如果在下面的消息中报告username已被占用:

user.already_exists=Another user with the "{0}" username already exists

实现代码:? ?

@ExceptionMapping(statusCode = BAD_REQUEST, errorCode = "user.already_exists")public class UserAlreadyExistsException extends RuntimeException {    @ExposeAsArg(0) private final String username;    // constructor}

总结

本文介绍了Errors-spring-boot-starter对Spring Boot异常处理的一些改进。

来源:微点阅读??https://www.weidianyuedu.com

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:12:25  更:2022-11-05 00:16:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/10 18:36:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码