===============
== ffff65535 ==
===============
十六个一[1111111111111111]

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);
    }
}