手动调用spring的@Validated校验

我们一般使用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;
    }
}
相关推荐
云和数据.ChenGuang7 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
摇滚侠7 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
silvamux_10 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
步行cgn11 小时前
StringHttpMessageConverter 详解:Spring MVC 中字符串读写的默认转换器
java·spring·mvc
摇滚侠11 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python
小蒜学长11 小时前
基于Spring Boot+Vue3的在线医疗咨询系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·在线问诊·在线医疗咨询系统
Deng桑11 小时前
SpringAI写第一个Agent-把工单循环跑起来
java·agent·工具调用·spring ai
步行cgn13 小时前
@ResponseBody 详解:Spring MVC 中把返回值直接写入响应体
java·spring·mvc
jason成都14 小时前
RTKLIB 的 Java 移植版来了:rtklib-java v3.3.0 功能全景
java·gnss·rtklib·rtklib_java
LazyHunter914 小时前
JDK 28:Java 下一步方向解析与新特性展望
java·jdk