java - 使用 Spring Boot 处理 REST 中的自定义验证和异常

标签 java spring rest spring-boot validation

Sample Project Attached Here

我正在关注这篇文章API Error Handling (也请建议是否有更好的方法来做到这一点)在我的 Spring Boot Rest 服务中以通用方式处理异常和验证。 (我是 Spring 和 Rest 的新手,所以我正在根据我的要求查看不同的文章)

有关要求的基本想法:

(需要验证POST请求,并将验证错误以结构化的方式发送给客户端,可能会有多个验证错误)

每当我收到来自客户端的 POST 请求时,我都需要验证 RequestBody。因此,我在参数上添加了 @Valid ,在我想要验证的属性上添加了 @NotNull 。收到 POST 请求后,spring 会验证请求并抛出 MethodArgumentNotValidException ,这很好,因为我缺少一些必填字段。 我在一个与@ControllerAdvice 相同的地方处理它。在点击适当的方法handleMethodArgumentNotValid(...)后,我正在构建我的自定义错误响应APICustomError,这是我从上述文章中遵循的。

当我有多个验证错误时,我可以循环所有错误并将其添加到列表中并使用我的自定义错误构造 ResponseEntity。 但返回的 ResponseEntity 没有我添加的验证错误。

我理解了这篇文章并在我的项目中实现了相同的内容,但确实没有得到我所缺少的东西。

以下是文章中所说的输出,我期望的是:

{
   "apierror":{
      "status":"BAD_REQUEST",
      "timestamp":"10-07-2019 12:53:24",
      "message":"Validation error",
      "subErrors":[
         {
            "object":"person",
            "field":"id",
            "rejectedValue":null,
            "message":"ID cannot be null"
         },
         {
            "object":"person",
            "field":"name",
            "rejectedValue":null,
            "message":"name cannot be null"
         }
      ]
   }
}

但下面是我得到的。我根本没有看到 subErrors 部分。

{"message":"Validation Error","debugMessage":null,"detail":null,"httpStatus":"BAD_REQUEST","timestamp":"2019-07-10T17:08:00.52"}

感谢任何帮助。

最佳答案

您需要在 APICustomError 中添加 getter 和 setter 才能正确序列化您的对象。此外,您还需要内部类 APIValidationError 的公共(public)构造函数和 getter/setter。我建议您使用 Lombok。

之后你会看到错误,类似这样......

{
   "message": "Validation Error",
   "debugMessage": null,
   "subErrors": [
       {
           "object": "personDTO",
           "field": "id",
           "rejectedValue": null,
           "validationErrorMessage": "ID cannot be null."
       }
   ],
   "detail": null,
   "httpStatus": "BAD_REQUEST",
   "timestamp": "2019-07-10T10:25:44.1705441"
}

关于java - 使用 Spring Boot 处理 REST 中的自定义验证和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56970576/

相关文章:

java - 没有抛出此类方法异常?

java - 使用 Java 的 Selenium Webdriver 中的小数位为 2 个值

java - Hikari 如何回收连接?

python - json.解码器.JSONDecodeError : Unexpected UTF-8 BOM (decode using utf-8-sig)

java - cxf webclient - 异常[请求处理失败;嵌套异常是 Status : 406

java - 如何测试飞路迁移?

c# - WCF 与 Java Web 服务通信

spring - Web 应用程序的 100% 正常运行时间

java - 如何测试在类路径上找不到文件? java( Spring @Configuration)

rest - GitHub API 返回错误的文件内容