JSR303自定义校验

文章目录

  • 前言
  • 一、编写一个自定义校验注解
        • 1.新建一个Annotation
        • 2.使用注解
  • 二、编写自定义的校验器
    • 1.实现ConstraintValidator
    • 2.在注解定义的地方添加上校验器


前言

虽说BeanValidation支持使用@Pattern做正则校验,但是很多时候还是不能满足我们的需求。譬如如下场景:显示状态showStatus只支持0和1两种情况。这时,我们就可以用到自定义校验。

一、编写一个自定义校验注解

1.新建一个Annotation

JSR303自定义校验_第1张图片
注解必须满足JSR303规范。这里可以随便参考一个已经存在的注解。

package com.linqibin.common.valid;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Target({
     ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {
     }
)
public @interface ListValue {
     
    // 默认加载ValidationMessages.properties这个文件下的message
    String message() default "{com.linqibin.common.valid.ListValue.message}";

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

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

    int[] vals() default {
     };
}

JSR303自定义校验_第2张图片
注意:@Constraint和payload需要添加如下依赖

<dependency>
    <groupId>javax.validationgroupId>
    <artifactId>validation-apiartifactId>
    <version>2.0.1.Finalversion>
dependency>

message这个字段会默认加载ValidationMessages.properties这个文件下的message,也可以在使用注解的时候自己定义一个。

2.使用注解

在实体类的字段上就可以标注该注解了,不过此时并未指定注解的校验器。
JSR303自定义校验_第3张图片

二、编写自定义的校验器

1.实现ConstraintValidator

编写自定义的校验器需要实现ConstraintValidator这个接口,需要传递两个泛型,第一个是校验的注解,第二个是校验的数据类型是啥。

代码如下:

package com.linqibin.common.valid;

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

public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {
     

    private Set<Integer> set = new HashSet<>();

    /**
     * 初始化方法, 会将注解里面的信息获取过来
     *
     * @author hugh&you
     * @since 2021/1/22 17:17
     */
    @Override
    public void initialize(ListValue constraintAnnotation) {
     
        int[] vals = constraintAnnotation.vals();
        if (vals.length > 0) {
     
            for (int val : vals) {
     
                set.add(val);
            }
        }
    }

    /**
     * 判断是否校验成功
     *
     * @param integer 需要校验的值
     * @author hugh&you
     * @since 2021/1/22 17:26
     */
    @Override
    public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
     
        return set.contains(integer);
    }
}

2.在注解定义的地方添加上校验器

代码如下(示例):
JSR303自定义校验_第4张图片

一个注解可以添加多个校验器,这个校验器只能校验类型是Integer的。如果将来需要被标注在Double类型上,则需要重新写一个Double的校验器。

JSR303自定义校验_第5张图片

你可能感兴趣的:(java学习笔记,java,spring,boot)