自定义校验源码
# 自定义校验
## 校验合理范围内
```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=不在合理范围之内
```