手动调用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;
    }
}
相关推荐
贫民窟的勇敢爷们3 小时前
SpringBoot整合AOP切面编程实战,实现日志统一记录+接口权限校验
java·spring boot·spring
AC赳赳老秦4 小时前
供应链专员提效:OpenClaw自动跟踪物流信息、更新库存数据,异常自动提醒
java·大数据·服务器·数据库·人工智能·自动化·openclaw
迈巴赫车主4 小时前
Java基础:list、set、map一遍过
java·开发语言
灵犀学长4 小时前
基于 Spring ThreadPoolTaskScheduler + CronTrigger 实现的动态定时任务调度系统
java·数据库·spring
好家伙VCC6 小时前
【无标题】
java
小碗羊肉6 小时前
【JavaWeb | 第十一篇】文件上传(本地&阿里云OSS)
java·阿里云·servlet
吾疾唯君医7 小时前
Java SpringBoot集成积木报表实操记录
java·spring boot·spring·导出excel·积木报表·数据文件下载
Byron Loong7 小时前
【c++】为什么有了dll和.h,还需要包含lib
java·开发语言·c++
hexu_blog8 小时前
vue+java实现图片批量压缩
java·前端·vue.js
头歌实践平台8 小时前
Hadoop开发环境搭建
java·大数据·hadoop