Skip to content

Commit 3bdacaa

Browse files
committed
✨ 添加集合类型校验validator
1 parent 1bf2d9c commit 3bdacaa

File tree

5 files changed

+191
-1
lines changed

5 files changed

+191
-1
lines changed

summer-validator/src/main/java/com/dianpoint/summer/validator/ValidationRules.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.dianpoint.summer.validator;
22

3+
import java.util.*;
4+
35
/**
46
* @author: congccoder
57
* @email: congccoder@gmail.com | <a href="https://github.com/ccoderJava">github-homepage</a>
@@ -42,4 +44,45 @@ public static ValidationRule<Integer> max(int value) {
4244
ValidationResult.failure("不能大于" + value, "integer");
4345
}
4446

47+
//设置collections相关的校验规则
48+
public static <C extends Collection<?>> ValidationRule<C> minsize(int min) {
49+
return collection -> collection != null && collection.size() >= min ?
50+
ValidationResult.success() :
51+
ValidationResult.failure("集合大小不能小于" + min, "collection");
52+
}
53+
54+
public static <C extends Collection<?>> ValidationRule<C> maxSize(int max) {
55+
return collection -> collection != null && collection.size() <= max ?
56+
ValidationResult.success() :
57+
ValidationResult.failure("集合大小不能大于" + max, "collection");
58+
}
59+
60+
public static <C extends Collection<?>> ValidationRule<C> range(int min, int max) {
61+
return collection -> collection != null && collection.size() >= min && collection.size() <= max ?
62+
ValidationResult.success() :
63+
ValidationResult.failure(String.format("集合大小必须在[%s,%s]之间", min, max), "collection");
64+
}
65+
66+
public static <E, C extends Collection<E>> ValidationRule<C> uniqueElements() {
67+
return collection -> {
68+
if (collection == null) {
69+
return ValidationResult.success();
70+
}
71+
Set<E> uniqueSet = new LinkedHashSet<>();
72+
List<E> duplicates = new ArrayList<>();
73+
74+
for (E element : collection) {
75+
if (!uniqueSet.add(element)) {
76+
//set中添加失败代表元素element已经存在
77+
duplicates.add(element);
78+
}
79+
}
80+
return duplicates.isEmpty() ?
81+
ValidationResult.success() :
82+
ValidationResult.failure("集合中包含重复元素" + duplicates, "collection");
83+
84+
};
85+
}
86+
87+
4588
}

summer-validator/src/main/java/com/dianpoint/summer/validator/Validators.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
import com.dianpoint.summer.validator.validator.AnnotationValidatorAdapter;
44
import com.dianpoint.summer.validator.validator.GenericValidator;
55
import com.dianpoint.summer.validator.validator.Validator;
6+
import com.dianpoint.summer.validator.validator.collection.CollectionValidator;
7+
import com.dianpoint.summer.validator.validator.collection.DefaultCollectionValidator;
68

9+
import java.util.Collection;
10+
import java.util.List;
711
import java.util.Objects;
812
import java.util.function.Predicate;
913

@@ -44,5 +48,12 @@ public static <T> Validator<T> annotated(Class<T> targetClass) {
4448
return AnnotationValidatorAdapter.create(targetClass);
4549
}
4650

51+
//针对collection创建校验器
52+
53+
public static <E, C extends Collection<E>> CollectionValidator<E, C> collection(Class<C> collectionType, Class<E> elementType) {
54+
return new DefaultCollectionValidator<>(collectionType, elementType);
55+
}
56+
57+
//重载一下list 和set两种collection的校验器
4758

4859
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.dianpoint.summer.validator.validator.collection;
2+
3+
import com.dianpoint.summer.validator.ValidationRule;
4+
import com.dianpoint.summer.validator.validator.Validator;
5+
6+
import java.util.Collection;
7+
import java.util.function.Predicate;
8+
9+
/**
10+
* @author: congccoder
11+
* @email: congccoder@gmail.com | <a href="https://github.com/ccoderJava">github-homepage</a>
12+
* @date: 2025/5/24 14:59
13+
*/
14+
15+
public interface CollectionValidator<E, C extends Collection<E>> extends Validator<C> {
16+
17+
18+
/**
19+
* 集合校验接口 用于对集合及其元素进行校验
20+
*
21+
* @param rule 元素校验器规则
22+
* @return 集合类型必须是Collection<E> 的子类
23+
*/
24+
CollectionValidator<E, C> elementRule(ValidationRule<E> rule);
25+
26+
27+
/**
28+
* 为集合中每个元素添加基于predicate的校验规则
29+
*
30+
* @param condition 校验条件
31+
* @param errorMessage 校验失败时的错误提示信息
32+
* @return 集合校验器实例 支持链式调用
33+
*/
34+
CollectionValidator<E, C> elementRule(Predicate<E> condition, String errorMessage);
35+
36+
/**
37+
* 为集合中每个元素添加一个校验器
38+
*
39+
* @param validator 元素校验器
40+
* @return 当前校验器实例 支持链式调用
41+
*/
42+
CollectionValidator<E, C> elementValidator(Validator<E> validator);
43+
44+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.dianpoint.summer.validator.validator.collection;
2+
3+
import com.dianpoint.summer.validator.ValidationResult;
4+
import com.dianpoint.summer.validator.ValidationRule;
5+
import com.dianpoint.summer.validator.Validators;
6+
import com.dianpoint.summer.validator.validator.AbstractValidator;
7+
import com.dianpoint.summer.validator.validator.Validator;
8+
9+
import java.util.Collection;
10+
import java.util.Collections;
11+
import java.util.List;
12+
import java.util.Objects;
13+
import java.util.function.Predicate;
14+
15+
/**
16+
* @author: congccoder
17+
* @email: congccoder@gmail.com | <a href="https://github.com/ccoderJava">github-homepage</a>
18+
* @date: 2025/5/24 15:05
19+
*/
20+
21+
public class DefaultCollectionValidator<E, C extends Collection<E>> extends AbstractValidator<C> implements CollectionValidator<E, C> {
22+
23+
private Validator<E> elementValidator;
24+
25+
public DefaultCollectionValidator(Class<C> collectionType, Class<E> elementType) {
26+
addRule(Objects::nonNull, "集合不能为null", "collection");
27+
}
28+
29+
30+
@Override
31+
public CollectionValidator<E, C> elementRule(ValidationRule<E> rule) {
32+
if (elementValidator == null) {
33+
//初始化元素校验器
34+
elementValidator = Validators.generic();
35+
}
36+
elementValidator.addRule(rule);
37+
return this;
38+
}
39+
40+
@Override
41+
public CollectionValidator<E, C> elementRule(Predicate<E> condition, String errorMessage) {
42+
return elementRule(target -> condition.test(target) ? ValidationResult.success() : ValidationResult.failure(errorMessage));
43+
}
44+
45+
@Override
46+
public CollectionValidator<E, C> elementValidator(Validator<E> validator) {
47+
elementValidator = validator;
48+
return this;
49+
}
50+
51+
52+
@Override
53+
public List<ValidationResult> validate(C collection) {
54+
List<ValidationResult> results = super.validate(collection);
55+
if (collection == null || collection.isEmpty()) {
56+
return results;
57+
}
58+
59+
if (elementValidator == null) {
60+
return results;
61+
}
62+
int index = 0;
63+
for (E element : collection) {
64+
List<ValidationResult> elementResults = elementValidator.validate(element);
65+
for (ValidationResult elementResult : elementResults) {
66+
if (elementResult.isFailure()) {
67+
results.add(ValidationResult.failure(String.format("元素[%s]:%s collection[%s]", index
68+
, elementResult.getErrorMessage(), index)));
69+
}
70+
}
71+
index++;
72+
}
73+
return results;
74+
}
75+
}

summer-validator/src/test/java/com/dianpoint/summer/validator/test/ValidatorDemo.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.dianpoint.summer.validator.Validators;
77
import com.dianpoint.summer.validator.test.cases.User;
88

9+
import java.util.Arrays;
910
import java.util.List;
1011

1112
/**
@@ -22,7 +23,9 @@ public static void main(String[] args) {
2223
// validateAge(16);
2324
// validateAge(21);
2425

25-
validateObject();
26+
// validateObject();
27+
28+
validateCollectionString();
2629
}
2730

2831
static void validateEmail(String email) {
@@ -54,6 +57,20 @@ static void validateObject() {
5457
}
5558

5659

60+
static void validateCollectionString() {
61+
List<String> strList = Arrays.asList("张三", "李四", "", null, "王五", "小王");
62+
List<ValidationResult> validationResults = Validators.collection(List.class, String.class)
63+
.elementRule(str -> str != null, "元素不等为null")
64+
.elementRule(str -> str.isEmpty(), "元素不能为空字符串")
65+
.addRule(ValidationRules.minsize(1))
66+
.addRule(ValidationRules.maxSize(10))
67+
.addRule(ValidationRules.range(3, 5))
68+
.validate(strList);
69+
70+
printResults(validationResults);
71+
}
72+
73+
5774
static void printResults(List<ValidationResult> validateResult) {
5875
for (ValidationResult result : validateResult) {
5976
System.out.println(result.getFieldName() + "校验结果:" + result.getErrorMessage());

0 commit comments

Comments
 (0)