springcloud:自定义校验代码实现。

目标:书写自定义校验注解和自定义校验器

自定义校验
*      1)、编写一个自定义的校验注解
*      2)、编写一个自定义的校验器 ConstraintValidator
*      3)、关联自定义的校验器和自定义的校验注解

1.为实体加上自定义校验注解@ListValue:

    /**
	 * 显示状态[0-不显示;1-显示],自定义校验,只有0,1
	 */
	@ListValue(vals={0,1},groups = {AddGroup.class})
	private Integer showStatus;

2.在公共服务common下新建目录存放自定义校验注解ListValue以及自定义校验器ListValueConstraintValidator以及在resource下创建自定义校验的配置文件ValidationMessages.properties:

3.根据其他常规校验注解如@NotBlank编写自定义校验注解:

@Documented
@Constraint(
    validatedBy = {}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(NotBlank.List.class)
public @interface NotBlank {
    String message() default "{javax.validation.constraints.NotBlank.message}";

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

    Class<? extends Payload>[] payload() default {};

    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface List {
        NotBlank[] value();
    }
}

仿写出自定义注解@ListValue:

/**
 * 自定义校验注解,仿照@NotBlank写
 */
@Documented
//使用哪个校验器校验的
@Constraint(
        validatedBy = {}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)

public @interface ListValue {
    //在配置文件中取出com.atguigu.common.valid.ListValue.ListValue中的错误提示,
    // 根据配置文件ValidationMessages.properties,自定义一个ValidationMessages.properties配置文件在common服务下
    String message() default "{com.atguigu.common.valid.ListValue.message}";

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

    Class<? extends Payload>[] payload() default {};

    //指定vals的默认值
    int[] vals() default {};
}

在ValidationMessages.properties配置文件中配置报错信息:

com.atguigu.common.valid.ListValue.message=必须是指定的值0/1

5.导入依赖包:

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>

6.编写自定义校验器ListValueConstraintValidator:

/**
 * 来源于自定义校验中validatedBy(),validatedBy()可以参考多个校验器;
 * <p>
 * 继承ConstraintValidator<校验注解,字段类型>
 */
public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {

    //定义一个Set<>用于存放详细信息
    private Set<Integer> set = new HashSet<>();

    //初始化方法,获取自定义注解的详细信息 如:(vals={0,1})
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] vals = constraintAnnotation.vals();
        for (int val : vals) {
            set.add(val);
        }
    }

    /**
     *
     * @param value 需要校验的值
     * @param context 整个校验的上下文环境信息
     * @return
     */
    //判断是否校验成功,根据传入需要校验的值,如:3
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {

        //做判断,如果包含了返回TRUE,否则返回FALSE
        return set.contains(value);
    }
}

7.在@ListValue中关联自定义校验注解和自定义校验器:

//使用哪个校验器校验的
@Constraint(
        validatedBy = {ListValueConstraintValidator.class}
)

8.测试输入非指定的值:

输入指定的值:

自定义校验实现。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值