diff --git a/continew-starter-core/pom.xml b/continew-starter-core/pom.xml
index 1db90fbc..632a5eae 100644
--- a/continew-starter-core/pom.xml
+++ b/continew-starter-core/pom.xml
@@ -23,6 +23,13 @@
spring-boot-configuration-processor
+
+
+ org.hibernate.validator
+ hibernate-validator
+ true
+
+
net.dreamlu
diff --git a/continew-starter-core/src/main/java/top/continew/starter/core/util/validate/ValidationUtils.java b/continew-starter-core/src/main/java/top/continew/starter/core/util/validate/ValidationUtils.java
index 8518e2f2..e16f6412 100644
--- a/continew-starter-core/src/main/java/top/continew/starter/core/util/validate/ValidationUtils.java
+++ b/continew-starter-core/src/main/java/top/continew/starter/core/util/validate/ValidationUtils.java
@@ -16,9 +16,14 @@
package top.continew.starter.core.util.validate;
+import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import jakarta.validation.ConstraintViolation;
import top.continew.starter.core.exception.BadRequestException;
+import java.util.Set;
import java.util.function.BooleanSupplier;
/**
@@ -173,4 +178,21 @@ public class ValidationUtils extends Validator {
public static void throwIf(BooleanSupplier conditionSupplier, String template, Object... params) {
throwIf(conditionSupplier, CharSequenceUtil.format(template, params), EXCEPTION_TYPE);
}
+
+ /**
+ * JSR 303 校验
+ *
+ * @param obj 被校验对象
+ * @param groups 分组
+ */
+ public static void validate(Object obj, Class>... groups) {
+ jakarta.validation.Validator validator = SpringUtil.getBean(jakarta.validation.Validator.class);
+ Set> violations = validator.validate(obj, groups);
+ if (CollUtil.isEmpty(violations)) {
+ return;
+ }
+ throw ReflectUtil.newInstance(EXCEPTION_TYPE, violations.stream()
+ .map(ConstraintViolation::getMessage)
+ .findFirst());
+ }
}