如何在 Spring Boot 应用程序中使用 Hibernate 验证进行 Bean 验证?

Posted

技术标签:

【中文标题】如何在 Spring Boot 应用程序中使用 Hibernate 验证进行 Bean 验证?【英文标题】:How to do Bean Validation with Hibernate Validation in Spring Boot app? 【发布时间】:2020-09-25 11:17:04 【问题描述】:

我正在学习 Spring Boot 应用程序中的 Hibernate 验证,并且我有一个 Rest 控制器和一个 POST 方法。当我发出请求时,如果一个字段未成功验证,客户端应该收到 400 Bad Request 并在正文中收到类似“验证失败”的消息。我尝试这样做,但消息没有来。

这是身体:


    "timestamp": "2020-06-06T07:56:11.377+00:00",
    "status": 400,
    "error": "Bad Request",
    "message": "",
    "path": "/ibantowallet"

在控制台日志中我得到:

2020-06-06 10:56:11.371  WARN 7552 --- [nio-8080-exec-8] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public org.springframework.http.ResponseEntity com.dgs.demotrans.api.TransactionController.sendMoneyIbanToWallet(com.dgs.demotrans.request.IbanToWalletRequest): [Field error in object 'ibanToWalletRequest' on field 'fromIban': rejected value [FR9151000 0000 0123 4567 89]; codes [Pattern.ibanToWalletRequest.fromIban,Pattern.fromIban,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [ibanToWalletRequest.fromIban,fromIban]; arguments []; default message [fromIban],[Ljavax.validation.constraints.Pattern$Flag;@3c555785,[a-zA-Z]2\d2[ ]\d4[ ]\d4[ ]\d4[ ]\d4[ ]\d2|DE\d20]; default message [IBAN validation failed]] ]

所以消息是空的,我希望客户端收到特定消息“IBAN验证失败”或“请提供金额”等,我该怎么做?提前谢谢!

【问题讨论】:

编写全局异常处理程序并处理违反约束的异常 【参考方案1】:

您要么必须创建一个处理 MethodArgumentNotValidExceptionControllerAdvice 方法,这是由休眠验证器引发的错误,如下例所示:

    @ResponseStatus(BAD_REQUEST)
    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public CustomError methodArgumentNotValidException(MethodArgumentNotValidException ex) 
        BindingResult result = ex.getBindingResult();
        List<org.springframework.validation.FieldError> fieldErrors = result.getFieldErrors();
        return mapToCustomError(fieldErrors);
    

或者您可以在控制器方法中注入 BindingResult 并检查验证是否失败:

    @PostMapping("/ibantoiban")
    public ResponseEntity<String> sendMoneyIbanToIban(@Valid @RequestBody IbanToIbanRequest ibanToIbanRequest, BindingResult bindingResult) 
        if (bindingResult.hasErrors())  /** handle error here */ 
        Transaction transaction = transactionService.sendMoneyIbanToIban(ibanToIbanRequest);

        HttpHeaders headers = new HttpHeaders();
        headers.add("Location", "/ibantoiban" + transaction.getTransactionId().toString());
        return new ResponseEntity(headers, HttpStatus.CREATED);
    

【讨论】:

以上是关于如何在 Spring Boot 应用程序中使用 Hibernate 验证进行 Bean 验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring-Boot 应用程序中使用 JavaScript 加入枚举

如何使用 CommandLineJobRunner 调用嵌入在 Spring Boot 应用程序中的 Spring Batch 作业

如何在 Spring (Boot) 应用程序的代码中动态添加 bean?

如何使用spring dev工具在docker中自动重新加载spring boot应用程序

如何在 JUnitTests 中使用 ObjectMapper - Spring Boot 应用程序

教你如何在Spring Boot中使用RSocket