我们一般使用spring的校验,是在dao类中定义好校验逻辑,例如@NotBlank(message="xxx不能为空"),spring的拦截器会在请求进入controller层之前进行校验:
@PostMapping("/list") public RequestResult<String> list(@RequestBody @Validated XXDto dto) { }现在要求不通过前端请求时触发校验,要在代码里面手动调用dao类的校验逻辑,实现方式如下:
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; } }