自定义校验源码

# 自定义校验 ## 校验合理范围内 ```java /** * @className: com.junjie.bitmall.common.valid.anno.ListValue * @description: * @author: 江骏杰 * @create: 2023-07-10 12:07 */ @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint( validatedBy = {ListValueConstraintValidator.class} // 校验器数组(一个校验注解可以绑定多个校验器) ) public @interface ListValue { String message() default "{com.junjie.bitmall.common.valid.anno.ListValue.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; int[] value() default { }; // 动态提供允许的数值, 只允许为int } ``` ```java /** * @className: com.junjie.bitmall.common.valid.constraintvalidator.ListValueConstraintValidator * @description: ListValue对应的校验器, 校验的类型是Integer, 即, 两个泛型分别是校验的注解和校验的类型 * @author: 江骏杰 * @create: 2023-07-10 18:21 */ public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> { private Set<Integer> validSet; /** * 初始化校验器 * @param constraintAnnotation annotation instance for a given constraint declaration */ @Override public void initialize(ListValue constraintAnnotation) { validSet = new HashSet<Integer>() { { // 这里不需要非空判断 for (int val : constraintAnnotation.value()) { this.add(val); } } }; } @Override public boolean isValid(Integer value, ConstraintValidatorContext context) { return value == null || validSet.contains(value); // 不对空值进行判断 } } ``` ## 校验集合中全是URL ```java package com.junjie.bitmall.common.valid.anno; import com.junjie.bitmall.common.valid.constraintvalidator.CollectionURLConstraintValidator; import com.junjie.bitmall.common.valid.constraintvalidator.ListValueConstraintValidator; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; /** * @className: com.junjie.bitmall.common.valid.anno.CollectionURL * @description: * @author: 江骏杰 * @create: 2023-07-16 17:46 */ @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint( validatedBy = {CollectionURLConstraintValidator.class} // 校验器数组(一个校验注解可以绑定多个校验器) ) public @interface CollectionURL { String message() default "{com.junjie.bitmall.common.valid.anno.CollectionURL.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; } ``` ```java package com.junjie.bitmall.common.valid.constraintvalidator; import com.junjie.bitmall.common.valid.anno.CollectionURL; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.List; /** * @className: com.junjie.bitmall.common.valid.constraintvalidator.CollectionURLConstraintValidator * @description: * @author: 江骏杰 * @create: 2023-07-16 17:47 */ public class CollectionURLConstraintValidator implements ConstraintValidator<CollectionURL, List<String>> { @Override public boolean isValid(List<String> value, ConstraintValidatorContext context) { // 这里需要非空判断, 否则会出现空指针异常 if (value != null && !value.isEmpty()) for (String url : value) { if (!url.matches("^http://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$")) { return false; } } return true; } } ``` ## 校验MemberPrice集合 ```java @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint( validatedBy = {InnerMemberPricesValidConstraintValidator.class} // 校验器数组(一个校验注解可以绑定多个校验器) ) public @interface InnerMemberPricesValid { String message() default "{com.junjie.bitmall.common.valid.anno.InnerMemberPricesValidConstraintValidator.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; } ``` ```java public class InnerMemberPricesValidConstraintValidator implements ConstraintValidator<InnerMemberPricesValid, List<MemberPrice>> { @Override public boolean isValid(List<MemberPrice> memberPrices, ConstraintValidatorContext context) { if (memberPrices == null) { return false; // 为空不校验, 默认校验不成功 } for (MemberPrice memberPrice : memberPrices) { Long id = memberPrice.getId(); if (id == null || id == 0L) return false; // 不能空 String name = memberPrice.getName(); if (StringUtils.isBlank(name)) return false; // 不能为空串 BigDecimal price = memberPrice.getPrice(); if (price.compareTo(BigDecimal.ZERO) <= 0) return false; // 必须大于0 } return true; // 校验通过 } } ``` > 校验分组直接在common包, 按照规范创建接口即可 ```properties # ValidationMessages_zh_CN.properties com.junjie.bitmall.common.valid.anno.ListValue.message=不在合理范围之内 ```