Skip to content

Commit de5ec3d

Browse files
committed
perf: 优化测试工具,完全支持在不使用启动注解的情况下验证约束注解的逻辑
1 parent e939d6f commit de5ec3d

File tree

8 files changed

+53
-34
lines changed

8 files changed

+53
-34
lines changed

spel-validator-core/src/main/java/cn/sticki/spel/validator/core/SpelValidExecutor.java

+23
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.lang.reflect.Method;
1616
import java.util.*;
1717
import java.util.concurrent.ConcurrentHashMap;
18+
import java.util.stream.Collectors;
1819

1920
/**
2021
* spel 相关注解的执行器,对使用了 {@link SpelConstraint} 进行标记的注解执行校验。
@@ -62,6 +63,25 @@ public static ObjectValidResult validateObject(@NotNull Object verifiedObject) {
6263
return validateObject(verifiedObject, Collections.emptySet());
6364
}
6465

66+
/**
67+
* 验证对象
68+
* <p>
69+
* 如果对象中有任意使用了 spel 约束注解的字段,则会对该字段进行校验。
70+
*
71+
* @param verifiedObject 被校验的对象
72+
* @param validateGroups 分组信息,只有同组的注解才会被校验
73+
* @return 对象校验结果
74+
*/
75+
@NotNull
76+
public static ObjectValidResult validateObject(@NotNull Object verifiedObject, String[] validateGroups) {
77+
if (validateGroups == null) {
78+
return validateObject(verifiedObject);
79+
}
80+
// 获取分组信息
81+
Set<Object> groups = Arrays.stream(validateGroups).map(it -> SpelParser.parse(it, verifiedObject)).collect(Collectors.toSet());
82+
return validateObject(verifiedObject, groups);
83+
}
84+
6585
/**
6686
* 验证对象
6787
* <p>
@@ -73,6 +93,9 @@ public static ObjectValidResult validateObject(@NotNull Object verifiedObject) {
7393
*/
7494
@NotNull
7595
public static ObjectValidResult validateObject(@NotNull Object verifiedObject, @NotNull Set<Object> validateGroups) {
96+
Objects.requireNonNull(verifiedObject);
97+
Objects.requireNonNull(validateGroups);
98+
7699
long startTime = System.nanoTime();
77100
log.debug("Spel validate start, class [{}], groups [{}]", verifiedObject.getClass().getName(), validateGroups);
78101
log.debug("Verified object [{}]", verifiedObject);

spel-validator-jakarta/src/main/java/cn/sticki/spel/validator/jakarta/SpelValidator.java

+1-8
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@
88
import jakarta.validation.ConstraintValidatorContext;
99
import lombok.extern.slf4j.Slf4j;
1010

11-
import java.util.Arrays;
12-
import java.util.Set;
13-
import java.util.stream.Collectors;
14-
1511
/**
1612
* {@link SpelValid} 的实际校验器
1713
*
@@ -41,11 +37,8 @@ public boolean isValid(Object value, ConstraintValidatorContext context) {
4137
return true;
4238
}
4339

44-
// 获取分组信息
45-
Set<Object> groups = Arrays.stream(spelValid.spelGroups()).map(it -> SpelParser.parse(it, value)).collect(Collectors.toSet());
46-
4740
// 校验对象
48-
ObjectValidResult validateObjectResult = SpelValidExecutor.validateObject(value, groups);
41+
ObjectValidResult validateObjectResult = SpelValidExecutor.validateObject(value, spelValid.spelGroups());
4942

5043
// 构建错误信息
5144
buildConstraintViolation(validateObjectResult, context);

spel-validator-javax/src/main/java/cn/sticki/spel/validator/javax/SpelValidator.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88

99
import javax.validation.ConstraintValidator;
1010
import javax.validation.ConstraintValidatorContext;
11-
import java.util.Arrays;
12-
import java.util.Set;
13-
import java.util.stream.Collectors;
1411

1512
/**
1613
* {@link SpelValid} 的实际校验器
@@ -41,11 +38,8 @@ public boolean isValid(Object value, ConstraintValidatorContext context) {
4138
return true;
4239
}
4340

44-
// 获取分组信息
45-
Set<Object> groups = Arrays.stream(spelValid.spelGroups()).map(it -> SpelParser.parse(it, value)).collect(Collectors.toSet());
46-
4741
// 校验对象
48-
ObjectValidResult validateObjectResult = SpelValidExecutor.validateObject(value, groups);
42+
ObjectValidResult validateObjectResult = SpelValidExecutor.validateObject(value, spelValid.spelGroups());
4943

5044
// 构建错误信息
5145
buildConstraintViolation(validateObjectResult, context);

spel-validator-javax/src/test/java/cn/sticki/spel/validator/javax/bean/SpelAssertTestBean.java

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

33
import cn.sticki.spel.validator.core.constrain.SpelAssert;
4-
import cn.sticki.spel.validator.javax.SpelValid;
54
import cn.sticki.spel.validator.javax.util.ID;
65
import cn.sticki.spel.validator.javax.util.VerifyFailedField;
76
import cn.sticki.spel.validator.javax.util.VerifyObject;
@@ -20,7 +19,7 @@
2019
public class SpelAssertTestBean {
2120

2221
@Data
23-
@SpelValid(spelGroups = "#this.group")
22+
// @SpelValid(spelGroups = "#this.group")
2423
public static class ParamTestBean implements ID {
2524

2625
private int id;
@@ -58,7 +57,7 @@ public static List<VerifyObject> paramTestCase() {
5857
bean,
5958
VerifyFailedField.of(ParamTestBean::getTest2),
6059
VerifyFailedField.of(ParamTestBean::getTest4, "test4")
61-
));
60+
).setGroups("#this.group"));
6261

6362
ParamTestBean bean2 = new ParamTestBean();
6463
bean2.setId(2);
@@ -68,7 +67,7 @@ public static List<VerifyObject> paramTestCase() {
6867
bean2,
6968
VerifyFailedField.of(ParamTestBean::getTest2),
7069
VerifyFailedField.of(ParamTestBean::getTest5, "group1")
71-
));
70+
).setGroups("#this.group"));
7271

7372
ParamTestBean bean3 = new ParamTestBean();
7473
bean3.setId(3);
@@ -77,7 +76,7 @@ public static List<VerifyObject> paramTestCase() {
7776
list.add(VerifyObject.of(
7877
bean3,
7978
VerifyFailedField.of(ParamTestBean::getTest2)
80-
));
79+
).setGroups("#this.group"));
8180

8281
ParamTestBean bean4 = new ParamTestBean();
8382
bean4.setId(4);
@@ -88,13 +87,13 @@ public static List<VerifyObject> paramTestCase() {
8887
VerifyFailedField.of(ParamTestBean::getTest2),
8988
VerifyFailedField.of(ParamTestBean::getTest4, "test4"),
9089
VerifyFailedField.of(ParamTestBean::getTest6, "group2")
91-
));
90+
).setGroups("#this.group"));
9291

9392
return list;
9493
}
9594

9695
@Data
97-
@SpelValid
96+
// @SpelValid
9897
public static class EmptyTestBean {
9998

10099
@SpelAssert(condition = "true", assertTrue = "")

spel-validator-javax/src/test/java/cn/sticki/spel/validator/javax/bean/SpelMaxTestBean.java

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

33
import cn.sticki.spel.validator.core.constrain.SpelMax;
4-
import cn.sticki.spel.validator.javax.SpelValid;
54
import cn.sticki.spel.validator.javax.util.ID;
65
import cn.sticki.spel.validator.javax.util.VerifyFailedField;
76
import cn.sticki.spel.validator.javax.util.VerifyObject;
@@ -27,7 +26,7 @@ public class SpelMaxTestBean {
2726
*/
2827
@Data
2928
@Builder
30-
@SpelValid
29+
// @SpelValid
3130
public static class ParamTestBean implements ID {
3231

3332
private int id;

spel-validator-javax/src/test/java/cn/sticki/spel/validator/javax/bean/SpelMinTestBean.java

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

33
import cn.sticki.spel.validator.core.constrain.SpelMin;
4-
import cn.sticki.spel.validator.javax.SpelValid;
54
import cn.sticki.spel.validator.javax.util.ID;
65
import cn.sticki.spel.validator.javax.util.VerifyFailedField;
76
import cn.sticki.spel.validator.javax.util.VerifyObject;
@@ -27,7 +26,7 @@ public class SpelMinTestBean {
2726
*/
2827
@Data
2928
@Builder
30-
@SpelValid
29+
// @SpelValid
3130
public static class ParamTestBean implements ID {
3231

3332
private int id;
@@ -164,7 +163,7 @@ public static List<VerifyObject> paramTestCase() {
164163
*/
165164
@Data
166165
@Builder
167-
@SpelValid
166+
// @SpelValid
168167
public static class RepeatableTestBean implements ID {
169168

170169
private int id;
@@ -240,7 +239,7 @@ public static List<VerifyObject> repeatableTestCase() {
240239
*/
241240
@Data
242241
@Builder
243-
@SpelValid
242+
// @SpelValid
244243
public static class ParamTestBean2 implements ID {
245244

246245
private int id;
@@ -311,7 +310,7 @@ public static List<VerifyObject> paramTest2Case() {
311310
*/
312311
@Data
313312
@Builder
314-
@SpelValid
313+
// @SpelValid
315314
public static class ValueTypeTestBean implements ID {
316315

317316
private int id;
@@ -513,7 +512,7 @@ public static List<VerifyObject> valueTypeTestCase() {
513512
*/
514513
@Data
515514
@Builder
516-
@SpelValid
515+
// @SpelValid
517516
public static class NotSupportValueTypeTestBean implements ID {
518517

519518
private int id;

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ public class ValidateUtil {
3434
*
3535
* @return 校验结果
3636
*/
37-
public static ObjectValidResult validate(Object obj) {
37+
public static ObjectValidResult validate(Object obj, String[] spelGroups) {
3838
// 如果对象没有使用 SpelValid 注解,则直接调用验证执行器进行验证
3939
// 这种情况下,只会验证本框架提供的约束注解
4040
if (!obj.getClass().isAnnotationPresent(SpelValid.class)) {
41-
return SpelValidExecutor.validateObject(obj);
41+
return SpelValidExecutor.validateObject(obj, spelGroups);
4242
}
4343

4444
// 通过 @Valid 的方式进行验证
@@ -74,6 +74,7 @@ public static boolean checkConstraintResult(List<VerifyObject> verifyObjectList)
7474
*/
7575
public static boolean checkConstraintResult(VerifyObject verifyObject) {
7676
Object object = verifyObject.getObject();
77+
String[] spelGroups = verifyObject.getSpelGroups();
7778
Collection<VerifyFailedField> verifyFailedFields = verifyObject.getVerifyFailedFields();
7879
boolean expectException = verifyObject.isExpectException();
7980

@@ -84,7 +85,7 @@ public static boolean checkConstraintResult(VerifyObject verifyObject) {
8485
int failCount = 0;
8586
try {
8687
// 执行约束校验
87-
ObjectValidResult validResult = ValidateUtil.validate(object);
88+
ObjectValidResult validResult = ValidateUtil.validate(object, spelGroups);
8889
failCount += processVerifyResult(verifyFailedFields, ConstraintViolationSet.of(validResult.getErrors()));
8990
} catch (Exception e) {
9091
if (expectException) {
@@ -164,5 +165,4 @@ private static int processVerifyResult(Collection<VerifyFailedField> verifyFaile
164165
return failCount;
165166
}
166167

167-
168168
}

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

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

33
import lombok.Data;
4+
import org.intellij.lang.annotations.Language;
45

56
import java.util.Arrays;
67
import java.util.Collection;
@@ -30,6 +31,12 @@ public class VerifyObject {
3031
*/
3132
private boolean expectException;
3233

34+
/**
35+
* spel 分组参数,当 object 未使用 @SpelValid 注解时,该参数生效
36+
*/
37+
@Language("spel")
38+
private String[] spelGroups;
39+
3340
private VerifyObject() {
3441
}
3542

@@ -107,4 +114,9 @@ public static VerifyObject of(Object object, Collection<VerifyFailedField> verif
107114
return verifyObject;
108115
}
109116

117+
public VerifyObject setGroups(@Language("spel") String... spelGroups) {
118+
this.spelGroups = spelGroups;
119+
return this;
120+
}
121+
110122
}

0 commit comments

Comments
 (0)