hibernate自定义校验器使用(字段在in范围以内)

1.自定义注解类DigitsMustInjava

@Constraint(validatedBy = DigitsMustInValidator.class) //具体的实现
@Target({java.lang.annotation.ElementType.METHOD,
        java.lang.annotation.ElementType.FIELD})
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Documented
public @interface DigitsMustIn {
    String message() default "{}不需在[{}]中"; //提示信息,能够写死,能够填写国际化的key

    int[] inArr();

    //下面这两个属性必须添加
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

2.实现DigitsMustInValidator校验服务git

public class DigitsMustInValidator implements ConstraintValidator<DigitsMustIn, Integer> {
    Integer[] ints;

    @Override
    public void initialize(DigitsMustIn constraintAnnotation) {
        int[] ints = constraintAnnotation.inArr();
        this.ints = ArrayUtils.toObject(ints);
    }

    @Override
    public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
        if (ArrayUtils.contains(ints, integer)) {
            return true;
        }
        constraintValidatorContext.disableDefaultConstraintViolation();//禁用默认的message的值
        //从新添加错误提示语句
        constraintValidatorContext.buildConstraintViolationWithTemplate("["+integer+"]" + "必须在" + Arrays.toString(ints) + "以内").addConstraintViolation();

        return false;
    }
}

3.在须要校验的字段上加自定义注解ide

@DigitsMustIn(inArr = {7, 8, 18})
private Integer sourceType;

4.验证ui

private void validate(Object validateObj) throws WMS3CheckedException {
    for (ConstraintViolation<Object> constraintViolation : Validation.buildDefaultValidatorFactory().getValidator().validate(validateObj)) {
        throw new WMS3CheckedException(WMS3ExceptionCode.UNKNOW_EXCEPTON.getCode(),
                constraintViolation.getPropertyPath() + constraintViolation.getMessage());
    }
}
相关文章
相关标签/搜索