谷粒商城学习——P69 JSR303自定义校验注解

1,编写一个自定义校验注解ListValue

package com.atguigu.common.valid;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * @Description: 自定义校验注解
 * @Author: zyn
 * @Date: 2021-7-2
 */
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {ListValueConstraintValidator.class })//指定自定义校验器
public @interface ListValue {
    String message() default "{com.atguigu.common.valid.ListVal.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
    int[] vals();
}
View Code

建ValidationMessages.proerties文件,配置ListValue中的指定的message

com.atguigu.common.valid.ListVal.message=必须提交指定的值
此处有个坑,坑了我一个多小时,.proerties属性值取出来一直乱码,最后看了@一篇文章给了思路,删除重建好了(并没有像文中那样单独指定properties文件编码)

2,编写一个自定义校验器

判断校验是否成功

package com.atguigu.common.valid;


import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;

/**
 * @Description: 自定義校验注解.
 * @Author: zyn
 * @Date: 2021-7-2
 */
//ConstraintValidator 接收两个
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
    private Set<Integer> set=new HashSet<>();
    //初始化方法
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int [] vals=constraintAnnotation.vals();//校验注解标注的指定的值
        for (int val : vals) {
            set.add(val);
        }
    }

    //判断是否校验成功
    /**
     * @Description:
     * @Author: zyn
     * @Date: 2021-7-5
     * @param value 标注校验注解属性的传过来的值,需要校验的值
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        return set.contains(value);
    }
}
View Code

3,关联自定义校验器和自定义校验注解

主要是校验注解中Constraint validatedBy指定自定义校验器,在步骤1代码中已呈现

实体类需要校验的字段标注步骤1的自定义校验注解

    @ListValue(vals={0,1},groups = AddGroup.class)
    private Integer showStatus;
原文地址:https://www.cnblogs.com/yanan7890/p/14974208.html