如何在 Spring Boot 应用程序中使用 Hibernate Validation 进行 Bean Validation?
How to do Bean Validation with Hibernate Validation in Spring Boot app?
我正在 Spring 引导应用程序中学习 Hibernate 验证,我有一个 Rest 控制器和一个 POST 方法。当我发出请求时,如果某个字段未成功验证,客户端应该会收到 400 Bad Request 并在正文中收到这样的消息 "validation failed"。我尝试这样做,但没有收到消息。
这是正文:
{
"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}\d{2}[ ]\d{4}[ ]\d{4}[ ]\d{4}[ ]\d{4}[ ]\d{2}|DE\d{20}]; default message [IBAN validation failed]] ]
所以消息是空的,我想让客户端收到特定消息"IBAN validation failed"或"Please provide an amount"等,我该怎么做?提前致谢!
您要么必须创建一个 ControllerAdvice
方法来处理 MethodArgumentNotValidException
,hibernate 验证器抛出的错误,如本例所示:
@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 引导应用程序中学习 Hibernate 验证,我有一个 Rest 控制器和一个 POST 方法。当我发出请求时,如果某个字段未成功验证,客户端应该会收到 400 Bad Request 并在正文中收到这样的消息 "validation failed"。我尝试这样做,但没有收到消息。
这是正文:
{
"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}\d{2}[ ]\d{4}[ ]\d{4}[ ]\d{4}[ ]\d{4}[ ]\d{2}|DE\d{20}]; default message [IBAN validation failed]] ]
所以消息是空的,我想让客户端收到特定消息"IBAN validation failed"或"Please provide an amount"等,我该怎么做?提前致谢!
您要么必须创建一个 ControllerAdvice
方法来处理 MethodArgumentNotValidException
,hibernate 验证器抛出的错误,如本例所示:
@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);
}