1.创建自定义注解 QueryCondationValidator
- @Constraint指定校验类。
- 除了自定义的message、require属性外,下面的groups和payload也是必须添加的。
- 注解校验类写在自定义注解中
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {QueryCondationValidator.FilterTypeCheck.class})
public @interface QueryCondationValidator {
String message() default "params.error";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
class FilterTypeCheck implements ConstraintValidator<QueryCondationValidator, Integer> {
@Override
public boolean isValid(Integer type, ConstraintValidatorContext constraintValidatorContext) {
return type != null && (type ==0 || type ==1);
}
}
}
2.在queryCondition属性添加了自定义注解
@Data
public class StoreUpdQueryDto {
@NotNull(message = "taskId不可为空")
Long taskId;
@NotEmpty(message = "stepTypes")
List<String> stepTypes;
@QueryCondationValidator(message = "queryCondition类型只能为0和1")
Integer queryCondition;
}
3.创建全局异常捕获类
- 在valid校验中,如果校验不通过,会产生BindException异常,这边进行全局异常捕获
@RestControllerAdvice
@Slf4j
public class ExceptionControllerAdvice {
/**
* @Validated @Valid仅对于表单提交有效,对于以json格式提交将会失效
* @param e
* @return
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(BindException.class)
public RestResponse bindExceptionHandler(BindException e) {
List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
List<String> msgList = fieldErrors.stream()
.map(o -> o.getDefaultMessage())
.collect(Collectors.toList());
String messages = StringUtils.join(msgList.toArray(), ";");
log.error("Validation格式校验异常: {}", messages);
return ResponseWarp.error(messages);
}
/**
* @Validated @Valid 前端提交的方式为json格式有效,出现异常时会被该异常类处理
* @param e
* @return
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public RestResponse handler(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
ObjectError objectError = bindingResult.getAllErrors().stream().findFirst().get();
String messages = objectError.getDefaultMessage();
log.error("MethodArgumentNotValidException异常: {}", messages);
return ResponseWarp.error(messages);
}
/**
* @NotBlank @NotNull @NotEmpty
* @param e
* @return
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = ConstraintViolationException.class)
public RestResponse handler(ConstraintViolationException e) {
List<String> msgList = new ArrayList<>();
for (ConstraintViolation<?> constraintViolation : e.getConstraintViolations()) {
msgList.add(constraintViolation.getMessage());
}
String messages = StringUtils.join(msgList.toArray(), ";");
log.error("entity格式校验异常: {}", messages);
return ResponseWarp.error(messages);
}
@ExceptionHandler(Exception.class)
public RestResponse methodArgumentNotValidExceptionHandler(Exception e) {
log.error("ExceptionControllerAdvice Exception: ", e);
return ResponseWarp.error("统一异常捕获,接口异常" + e.getMessage());
}
}