JSR303自定义注解校验

pom添加依赖

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

编写自定义校验注解

自定义校验注解 看个人需求命名,例如如下自定义注解 @ListValue

	/**
	 * 是否删除 ,显示状态
	 */
	@ListValue(vals={0,1},groups = {AddGroup.class})
	private Integer showStatus;

需求: 为字段showStatus添加自定义 校验 只能填写 0 和 1 的值
自定义了 校验注解@ListValue
groups = {AddGroup.class}) 是分组校验
AddGroup规定添加有效
要想自定义注解生效,就需要 自定义校验器 。

指定校验注解

一个自定义校验注解必须满足规范,在JSR303 规范中校验注解必须满足三个属性(以@NotBlank 注解为例):

    //校验出错误信息去哪里取 默认使用JSR303的ValidationMessages.properties 文件中取
    String message() default "{javax.validation.constraints.NotBlank.message}";
    //支持分组校验功能
    Class<?>[] groups() default {};
    //一些负载信息
    Class<? extends Payload>[] payload() default {};

校验注解必须标注源信息数据

@Documented
//使用哪一个校验器
@Constraint(
    validatedBy = {}
)
//tatget 注解可以标注在哪些位置  
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
//运行时获取
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(NotBlank.List.class)

因此新建一个注解类 命名为 ListValue

package com.xrp.common.valid;

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

/**
 * @author Dell
 * @date 2020/9/8 14:44
 * @Description
 */

@Documented
//指定校验器
@Constraint(
        validatedBy = {ListValueConstraintValidator.class}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
    //错误提示值一般为校验注解类的全类名.message    ListValue 的全类名 
    String message() default "{com.dell.common.valid.ListValue.message}";

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

    Class<? extends Payload>[] payload() default {};
     //定义注解@ListValue(vals={0,1},groups = {AddGroup.class})  vals值默认为空数组
    int [] vals () default { };
}

新建一个配置文件 为 ValidationMessages.properties ,配置文件中配上:

com.dell.common.valid.ListValue.message = 数值错误

properties 若中文乱码 建议使用unicode码

编写自定义校验器

新建类 ListValueConstraintValidator 实现 ConstraintValidator<T1,T2> 接口 声明两个泛型,第一个泛型:校验注解,第二个泛型 校验的字段类型
并实现初始化方法,和 判断校验是否成功方法

package com.xrp.common.valid;

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

/**
 * @author dell
 * @date 2020/9/8 14:55
 * @Description
 */
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {

     private Set<Integer> set = new HashSet<>();
    /**
     *  初始化方法
     */
    @Override
    public void initialize(ListValue constraintAnnotation) {
         // 说明给定的值  @ListValue(vals={0,1},groups = {AddGroup.class}) vals声明的值
        int[] vals = constraintAnnotation.vals();
        for (int val : vals) {
        //声明的值存入set
            set.add(val);
        }
    }
    /**
     *  判断是否校验成功
     *  value:提交过来需要校验的值(传的参)
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
         //判断提交的值是否在set中
        return set.contains(value);
    }
}

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

最后, 在注解类 @Constraint(
validatedBy = {ListValueConstraintValidator.class} )
中指定 ListValueConstraintValidator自定义校验器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值