MethodArgumentNotValidException类图(省略部分方法)
parameter主要提供校验失败的方法相关信息(方法对象、方法注释)与参数信息(Parameter对象、字段上的注解)等方法。bindResult为校验失败的绑定信息,主要提供获取校验的对象、字段错误信息、校验失败数目等方法。
知道校验异常中的属性主要信息与作用后便该对其提取出我们所需的信息了,以下为个人对该异常的处理代码Demo:(为了方便了解print了所有FieldError,一般实际中只需提取第一个异常即可):
/**
* body参数校验错误处理
*/
@ExceptionHandler({MethodArgumentNotValidException.class})
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Object postParamExceptionHandler(MethodArgumentNotValidException exception) {
FieldError fieldError = exception.getBindingResult().getFieldError();
String message = fieldError.getDefaultMessage();
// 获取校验对象
System.err.println("getTarget:" + exception.getBindingResult().getTarget().getClass());
// 遍历输出校验失败信息
exception.getBindingResult().getFieldErrors()
.forEach(e -> System.out.println(e.getField() + " " + e.getDefaultMessage()));
return msg(message.endsWith(";")
? String.format("%s%s", fieldError.getField(), message.substring(0, message.length() - 1)) : message);
}
UserVO.java
(注:若JSR注解中不含group而方法参数前的@Validated|@Valid设置了groups那该方法将忽略没有设置groups的JSR注解校验,如username的@NotBlank没有设置groups那username的校验只会发生在UserVO的校验注解没有设置groups的方法中)
@Data
public class UserVO {
@NotBlank(groups = UpdateGroup.class)
@Null(groups = InsertGroup.class)
private Integer id;
@NotBlank(groups = InsertGroup.class)
private String username;
private String password;
@Pattern(regexp = "ENABLE|DISABLE", groups = {InsertGroup.class, UpdateGroup.class}, message = "status须符合正则ENABLE|DISABLE-test")
private String status;
}
UserBaseController.java
@RestController
@RequestMapping("/userBase")
@Api
@Validated
public class UserBaseController {
@PostMapping("/")
public UserVO add(@RequestBody @Validated(InsertGroup.class) UserVO vo) {
return vo;
}
@PutMapping("/")
public UserVO update(@RequestBody @Validated(UpdateGroup.class) UserVO vo) {
return vo;
}
@DeleteMapping("/")
public UserVO delete(@RequestParam @Min(0) Integer id, @RequestParam @Pattern(regexp = "AAA|BBB", message = "test必须符合正则AAA|BBB") String test) {
return null;
}
}
调用UserBaseController.add()接口校验信息图如下:
由效果图可以看出字段与信息的拼接还是有点缺陷的,该缺陷个人是通过对ValidationMessages.properties进行一个小动作进行修复,具体在文末再详说(并含校验信息国际化方法)