手动调用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;
    }
}
相关推荐
Jelena157795857923 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
神明不懂浪漫4 小时前
【第五章】Java中的继承与多态
java·开发语言
AI多Agent协作实战派6 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug
gaolei_eit6 小时前
Java+Ai+vue
java·spring·maven
qq_2518364576 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
LayZhangStrive6 小时前
JUC相关的函数、注解、变量杂记
java·面试·多线程·juc
玉&心6 小时前
关于配置mcp服务端sse-message-endpoint和sse-endpoint的注意点
spring·springai·mcp
未秃头的程序猿6 小时前
给公司做了个AI客服Agent,用的Spring AI 1.0,3天上线领导拍板了
java·后端·ai编程
曹牧6 小时前
Eclipse 批量文本替换
java·ide·eclipse
程序员清风6 小时前
OpenAI官方发布最新提示词技巧!
java·后端·面试