假设我有以下DTO:
public class UserDTO {
public Long id;
@NotEmpty
public String name;
@Email
@NotEmpty
public String email;
@NotEmpty
@Size(min = 11, max = 11)
public String phone;
}
我发送以下json:
{
"name": "John Lennon",
"email": "jonnlennon"
}
我想使用以下正文返回错误422:
[{
"email": "it's not a valid mail"
}, {
"phone": "required field"
}]
如何在验证错误发生时实现通用@ControllerAdvice来处理?对于每个验证错误,我会在属性文件中获得相应的消息。
答案 0 :(得分:0)
使用rest controller advice来全局处理验证错误。
确保在休息控制器中为方法中的请求主体添加符号@Validation。
@RestControllerAdvice 公共类CustomExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody public ErrorResponse processValidationError(MethodArgumentNotValidException ex){ BindingResult result = ex.getBindingResult(); FieldError错误= result.getFieldError(); return error.getDefaultMessage(); }
答案 1 :(得分:0)
我创建了一个表示我的错误的类:
public class ErrorDetails {
private String property;
private String message;
public ErrorDetails(String property, String message) {
super();
this.property = property;
this.message = message;
}
// getter and setter
}
并配置我的 @ControllerAdvice ,如下所示:
@ControllerAdvice
public class RestExceptionHandler {
//others handlers
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> handleMethodArgumentNotValid(MethodArgumentNotValidException exception){
List<ErrorDetails> errors = new ArrayList<>();
if (exception.getBindingResult().hasErrors()) {
exception.getBindingResult().getFieldErrors().forEach(error -> {
errors.add(new ErrorDetails(error.getField(), error.getDefaultMessage()));
});
}
return ResponseEntity.unprocessableEntity().body(errors);
}
}