我们一般使用spring的校验,是在dao类中定义好校验逻辑,例如@NotBlank(message="xxx不能为空"),spring的拦截器会在请求进入controller层之前进行校验:
java
@PostMapping("/list")
public RequestResult<String> list(@RequestBody @Validated XXDto dto) {
}
现在要求不通过前端请求时触发校验,要在代码里面手动调用dao类的校验逻辑,实现方式如下:
java
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.*;
/**
* 实体校验工具
* <p>手动调用触发,可以不用通过Spring拦截器触发</p>
* <p>
* 基于 JSR-303 Bean Validation 规范实现的对象校验工具类,提供多种校验结果返回方式。
* 支持校验单个对象、List集合和数组对象。
* </p>
*
* <p>使用示例:</p>
* <pre>
* // 校验单个对象
* String error = ValidatorUtils.validateEntityResult(user);
*
* // 校验List集合
* String error = ValidatorUtils.validateEntityResult(userList);
*
* // 校验指定分组
* String error = ValidatorUtils.validateEntityResult(user, CreateGroup.class);
* </pre>
*
* @author lang.zhou
* @since 2025-02-27 15:34
* @see javax.validation.Validator
*/
public class ValidatorUtils {
private static final Validator validator;
// 第一种方式创建Validator
static {
// 普通模式(默认是这个模式)
// 普通模式(会校验完所有的属性,然后返回所有的验证失败信息)
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
/**
* 校验对象,返回校验失败Result信息
*
* @param object 对象
* @param groups 组
* @return 校验失败返回错误信息,成功返回成功信息
*/
public static String validateEntityResult(Object object, Class<?>... groups) {
Map<String, String> map = new HashMap<>();
// list集合
if (object instanceof List) {
for (Object o : (List) object) {
Map<String, String> validatedMap = validateEntityProperty(o, groups);
map.putAll(validatedMap);
}
} else if (object instanceof Object[]) {
// 数组
for (Object o : (Object[]) object) {
Map<String, String> validatedMap = validateEntityProperty(o, groups);
map.putAll(validatedMap);
}
} else {
// 单个对象
Map<String, String> validatedMap = validateEntityProperty(object, groups);
map.putAll(validatedMap);
}
if (map.size() > 0) {
// 错误信息:获取map的第一个非空value
String message = map.values().stream()
.filter(Objects::nonNull)
.findFirst()
.orElse("");
return message;
}
return null;
}
/**
* 校验对象,返回校验失败List信息
*
* @param object 对象
* @param groups 组
* @return 校验失败List信息
*/
public static List<String> validateEntity(Object object, Class<?>... groups) {
List<String> list = new ArrayList<>();
Set<ConstraintViolation<Object>> validate = validator.validate(object, groups);
for (ConstraintViolation<Object> violation : validate) {
list.add(violation.getMessage());
}
return list;
}
/**
* 校验对象,返回校验失败Map信息
*
* @param object 对象
* @param groups 组
* @return 校验失败Map信息,key为属性(字段名),value为校验失败信息
*/
public static Map<String, String> validateEntityProperty(Object object, Class<?>... groups) {
Map<String, String> map = new HashMap<>();
Set<ConstraintViolation<Object>> validate = validator.validate(object, groups);
for (ConstraintViolation<Object> violation : validate) {
map.put(violation.getPropertyPath().toString(), violation.getMessage());
}
return map;
}
}