手动调用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;
    }
}
相关推荐
欢迎来到祖安!4 小时前
企业微信 API 接口能力介绍:支持消息收发、图片发送、表情互动、联系人管理等多场景应用
java·前端·数据仓库·spring cloud·企业微信
dadaobusi8 小时前
学习:RV lkvm SBI
java·学习·spring
HEJOO910 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧10 小时前
Java:no content to map due to end of input
java·开发语言
阿维的博客日记10 小时前
Example 类全场景实战指南
java·mybatis
两点王爷10 小时前
SpringBoot 项目集成 GeoServer 源码,实现地图服务发布
java·spring boot·后端
Javatutouhouduan11 小时前
Java如何速通性能优化难题?
java·java面试·jvm调优·后端开发·java程序员·java八股文·java性能优化
lemon_sjdk11 小时前
DOM 节点
java·前端·javascript
leoZ23111 小时前
2026-09-09-springboot-cloud-deploy-pitfalls
java·前端·javascript·vue.js·人工智能·spring boot·后端
驭渊的小故事12 小时前
多线程02
java·开发语言·jvm