Skip to content

Commit e939d6f

Browse files
committed
perf: 优化测试工具,支持对未使用@SpelValid注解的类进行验证
1 parent eca6c16 commit e939d6f

File tree

4 files changed

+60
-39
lines changed

4 files changed

+60
-39
lines changed

spel-validator-core/src/main/java/cn/sticki/spel/validator/core/result/FieldError.java

+3
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,7 @@ public FieldError(String fieldName, String errorMessage) {
2929
this.errorMessage = errorMessage;
3030
}
3131

32+
public static FieldError of(String fieldName, String errorMessage) {
33+
return new FieldError(fieldName, errorMessage);
34+
}
3235
}

spel-validator-core/src/main/java/cn/sticki/spel/validator/core/result/ObjectValidResult.java

+8
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public class ObjectValidResult {
1515

1616
private final List<FieldError> errors = new ArrayList<>();
1717

18+
public static final ObjectValidResult EMPTY = new ObjectValidResult();
19+
1820
public boolean hasError() {
1921
return !errors.isEmpty();
2022
}
@@ -56,4 +58,10 @@ public void addFieldResult(FieldValidResult result) {
5658
errors.add(new FieldError(result.getFieldName(), result.getMessage()));
5759
}
5860
}
61+
62+
public void addFieldError(List<FieldError> fieldErrorList) {
63+
if (fieldErrorList != null && !fieldErrorList.isEmpty()) {
64+
errors.addAll(fieldErrorList);
65+
}
66+
}
5967
}

spel-validator-javax/src/test/java/cn/sticki/spel/validator/javax/util/ConstraintViolationSet.java

+14-27
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cn.sticki.spel.validator.javax.util;
22

3-
import javax.validation.ConstraintViolation;
3+
import cn.sticki.spel.validator.core.result.FieldError;
4+
45
import java.util.*;
56
import java.util.stream.Collectors;
67

@@ -14,33 +15,19 @@
1415
*/
1516
public class ConstraintViolationSet {
1617

17-
private static final ConstraintViolationSet EMPTY = new ConstraintViolationSet(Collections.emptyList());
18-
19-
private final Map<String, List<VerifyFailedField>> verifyMap;
18+
private final Map<String, List<FieldError>> verifyMap;
2019

21-
public ConstraintViolationSet(Collection<VerifyFailedField> failedFields) {
22-
if (failedFields == null || failedFields.isEmpty()) {
20+
public ConstraintViolationSet(Collection<FieldError> fieldErrors) {
21+
if (fieldErrors == null || fieldErrors.isEmpty()) {
2322
verifyMap = Collections.emptyMap();
2423
return;
2524
}
2625

27-
this.verifyMap = failedFields.stream().collect(Collectors.groupingBy(VerifyFailedField::getName));
28-
}
29-
30-
public static ConstraintViolationSet of(Set<ConstraintViolation<Object>> validate) {
31-
if (validate == null || validate.isEmpty()) {
32-
return EMPTY;
33-
}
34-
List<VerifyFailedField> list = validate.stream().map(ConstraintViolationSet::convert).collect(Collectors.toList());
35-
return new ConstraintViolationSet(list);
36-
}
37-
38-
public static ConstraintViolationSet of(List<VerifyFailedField> validate) {
39-
return new ConstraintViolationSet(validate);
26+
this.verifyMap = fieldErrors.stream().collect(Collectors.groupingBy(FieldError::getFieldName));
4027
}
4128

42-
private static VerifyFailedField convert(ConstraintViolation<Object> violation) {
43-
return VerifyFailedField.of(violation.getPropertyPath().toString(), violation.getMessage());
29+
public static ConstraintViolationSet of(List<FieldError> fieldErrors) {
30+
return new ConstraintViolationSet(fieldErrors);
4431
}
4532

4633
/**
@@ -50,20 +37,20 @@ private static VerifyFailedField convert(ConstraintViolation<Object> violation)
5037
* @param expectMessage 期望的错误信息
5138
* @return 字段约束结果,当 expectMessage 不为null时,会优先匹配具有相同message的数据
5239
*/
53-
public VerifyFailedField getAndRemove(String fieldName, String expectMessage) {
54-
List<VerifyFailedField> violationList = verifyMap.get(fieldName);
40+
public FieldError getAndRemove(String fieldName, String expectMessage) {
41+
List<FieldError> violationList = verifyMap.get(fieldName);
5542
if (violationList == null || violationList.isEmpty()) {
5643
return null;
5744
}
5845
if (violationList.size() == 1 || expectMessage == null) {
59-
VerifyFailedField violation = violationList.get(0);
46+
FieldError violation = violationList.get(0);
6047
verifyMap.remove(fieldName);
6148
return violation;
6249
}
6350
// 当存在多个约束时,优先匹配具有相同message的数据。
6451
// 否则当一个字段有多个约束条件时,无法匹配到期望的约束。
65-
for (VerifyFailedField violation : violationList) {
66-
if (expectMessage.equals(violation.getMessage())) {
52+
for (FieldError violation : violationList) {
53+
if (expectMessage.equals(violation.getErrorMessage())) {
6754
violationList.remove(violation);
6855
return violation;
6956
}
@@ -75,7 +62,7 @@ public VerifyFailedField getAndRemove(String fieldName, String expectMessage) {
7562
/**
7663
* 获取所有的约束违反字段
7764
*/
78-
public Set<VerifyFailedField> getAll() {
65+
public Set<FieldError> getAll() {
7966
return verifyMap.values().stream().flatMap(List::stream).collect(Collectors.toSet());
8067
}
8168

spel-validator-javax/src/test/java/cn/sticki/spel/validator/javax/util/ValidateUtil.java

+35-12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package cn.sticki.spel.validator.javax.util;
22

3+
import cn.sticki.spel.validator.core.SpelValidExecutor;
4+
import cn.sticki.spel.validator.core.result.FieldError;
5+
import cn.sticki.spel.validator.core.result.ObjectValidResult;
6+
import cn.sticki.spel.validator.javax.SpelValid;
37
import lombok.extern.slf4j.Slf4j;
48

59
import javax.validation.ConstraintViolation;
@@ -8,6 +12,7 @@
812
import java.util.Collection;
913
import java.util.List;
1014
import java.util.Set;
15+
import java.util.stream.Collectors;
1116

1217
/**
1318
* 测试验证工具类
@@ -25,12 +30,30 @@ public class ValidateUtil {
2530
/**
2631
* 参数校验
2732
* <p>
28-
* 调用此方法会触发 javax.validation.constraints.* 的校验,类似于使用 @Valid 注解
33+
* 调用此方法会触发约束校验
2934
*
30-
* @return 校验结果,如果校验通过则返回空列表
35+
* @return 校验结果
3136
*/
32-
public static <T> Set<ConstraintViolation<T>> validate(T obj) {
33-
return validator.validate(obj);
37+
public static ObjectValidResult validate(Object obj) {
38+
// 如果对象没有使用 SpelValid 注解,则直接调用验证执行器进行验证
39+
// 这种情况下,只会验证本框架提供的约束注解
40+
if (!obj.getClass().isAnnotationPresent(SpelValid.class)) {
41+
return SpelValidExecutor.validateObject(obj);
42+
}
43+
44+
// 通过 @Valid 的方式进行验证
45+
Set<ConstraintViolation<Object>> validate = validator.validate(obj);
46+
if (validate == null || validate.isEmpty()) {
47+
return ObjectValidResult.EMPTY;
48+
}
49+
ObjectValidResult validResult = new ObjectValidResult();
50+
List<FieldError> list = validate.stream().map(ValidateUtil::convert).collect(Collectors.toList());
51+
validResult.addFieldError(list);
52+
return validResult;
53+
}
54+
55+
private static FieldError convert(ConstraintViolation<Object> violation) {
56+
return FieldError.of(violation.getPropertyPath().toString(), violation.getMessage());
3457
}
3558

3659
/**
@@ -61,8 +84,8 @@ public static boolean checkConstraintResult(VerifyObject verifyObject) {
6184
int failCount = 0;
6285
try {
6386
// 执行约束校验
64-
Set<ConstraintViolation<Object>> validate = ValidateUtil.validate(object);
65-
failCount += processVerifyResult(verifyFailedFields, ConstraintViolationSet.of(validate));
87+
ObjectValidResult validResult = ValidateUtil.validate(object);
88+
failCount += processVerifyResult(verifyFailedFields, ConstraintViolationSet.of(validResult.getErrors()));
6689
} catch (Exception e) {
6790
if (expectException) {
6891
log.info("Passed, Capture exception {}, message: {}", e.getClass(), e.getMessage());
@@ -109,13 +132,13 @@ private static int processVerifyResult(Collection<VerifyFailedField> verifyFaile
109132

110133
boolean fieldMatch = false, find = false;
111134

112-
VerifyFailedField violation = violationSet.getAndRemove(fieldName, message);
113-
if (violation != null) {
135+
FieldError fieldError = violationSet.getAndRemove(fieldName, message);
136+
if (fieldError != null) {
114137
find = true;
115-
log.info("Real exception information: {}", violation.getMessage());
138+
log.info("Real exception information: {}", fieldError.getErrorMessage());
116139

117140
// 异常信息不同时验证失败(没填写异常信息则不校验异常信息)
118-
if (message != null && !message.equals(violation.getMessage())) {
141+
if (message != null && !message.equals(fieldError.getErrorMessage())) {
119142
log.error("Failed");
120143
} else {
121144
fieldMatch = true;
@@ -134,8 +157,8 @@ private static int processVerifyResult(Collection<VerifyFailedField> verifyFaile
134157

135158
LogContext.remove(fieldNameLogKey);
136159
// 被忽略的字段
137-
for (VerifyFailedField violation : violationSet.getAll()) {
138-
log.error("Field [{}] is ignored", violation.getName());
160+
for (FieldError violation : violationSet.getAll()) {
161+
log.error("Field [{}] is ignored", violation.getFieldName());
139162
failCount++;
140163
}
141164
return failCount;

0 commit comments

Comments
 (0)