手动调用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;
    }
}
相关推荐
阿巴斯甜1 天前
Function 用法:
java
做个文艺程序员1 天前
流式输出(SSE)在 Spring Boot 中的实现【OpenClAW + Spring Boot 系列 第3篇】
java·spring boot·后端
逻辑驱动的ken1 天前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
小手cool1 天前
如何在Java中根据另一个配对集合对一个集合进行排序
java·开发语言
云烟成雨TD1 天前
Spring AI Alibaba 1.x 系列【28】Nacos Skill 管理中心功能说明
java·人工智能·spring
升鲜宝供应链及收银系统源代码服务1 天前
OMS 订单模块重构正式文档(一)---升鲜宝生鲜配送供应链管理系统
java·开发语言·重构·生鲜配送源代码·生鲜供应链源代码
Han.miracle1 天前
Redis 全套笔记:基础 API + 三大架构 + 缓存三大问题
java·windows·redis
zzb15801 天前
Fragment 生命周期深度图解:从 onAttach 到 onDetach 完整流程(面试必备)
android·java·面试·安卓
QC·Rex1 天前
Spring AI MCP Apps 实战:打造聊天与富 UI 融合的智能化应用
人工智能·spring·ui·spring ai·mcp
银色火焰战车1 天前
浅析golang中的垃圾回收机制(GC)
java·jvm·golang