springboot 自定义校验注解
ConstraintValidator springboot自定义校验注解ConstraintValidator 不太合适,优化一下
maven
<!-- Validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
自定义校验注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 枚举校验注解
*
*/
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {EnumValidator.class})
public @interface EnumValid {
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
/**
* 目标枚举类
*/
Class<?> target() default Class.class;
}
注解校验逻辑
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@Slf4j
public class EnumValidator implements ConstraintValidator<EnumValid, Object> {
/**
* 枚举校验注解
*/
private EnumValid annotation;
@Override
public void initialize(EnumValid constraintAnnotation) {
annotation = constraintAnnotation;
}
/**
* 注解处理逻辑
*/
@Override
public boolean isValid(Object checkValue, ConstraintValidatorContext constraintValidatorContext) {
boolean exist = false;
Class<?> cls = annotation.target();
if (cls.isEnum()) {
Object[] objects = cls.getEnumConstants();
for (Object obj : objects) {
if (obj.equals(checkValue)) {
exist = true;
break;
}
}
// 校验未通过,并且message为null
if (StringUtils.isBlank(annotation.message()) && !exist) {
StringBuilder sb = new StringBuilder();
Method getName = null;
try {
getName = cls.getMethod("getName");
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
try {
for (Object obj : objects) {
Object invoke = getName.invoke(obj);
sb.append((String) invoke).append(",");
}
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
sb.deleteCharAt(sb.length() - 1);
String msg = sb.toString();
// 禁用默认的message的值
constraintValidatorContext.disableDefaultConstraintViolation();
// 重新添加错误提示语句
constraintValidatorContext.buildConstraintViolationWithTemplate("value must in:" + msg).addConstraintViolation();
}
}
return exist;
}
}
全局异常处理
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 全局异常处理
*/
@Slf4j
@RestControllerAdvice
public class RestCtrlExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(value = HttpStatus.OK)
public Result<Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
StringBuilder sb = new StringBuilder();
e.getBindingResult().getFieldErrors().forEach(error -> {
String fieldName = error.getField();
String message = error.getDefaultMessage();
sb.append(fieldName + "-" + message + ";");
});
String result = sb.toString();
if (result.length() > 0) {
result = result.substring(0, result.length() - 1);
}
// 返回值,自行替换
return new Result<>().setFailed(ResultCode.FAILED, result);
}
}