解决@Validated对List对象验证失效问题

 更新时间:2025年09月25日 08:58:01   作者:to方圆圆  
文章指出@Validated注解无法验证List数组参数,建议手动逐项验证或封装List为对象进行验证,前者代码冗余但直接,后者需调整JSON结构但更简洁,根据需求选择方案,权衡灵活性与参数改造成本

@Validated对List对象验证失效

在实际开发中,常常会对接口api入参做格式验证,有些入参是List数组对象。

  public ApiResponse receiveManualTranscoding(@Validated @RequestBody List<SdZmDto> sdZmDtos) 

其实这样是失效的,会发现其SdZmDto并不会进行验证。

因为@Validated参数只能验证单个对象。

解决方法1

手动对每一个参数对象进行做验证,但是代码会显得冗余

private ResultVo validate(@Valid SdZmDto gwbaDto) {
        Set<ConstraintViolation<@Valid SdZmDto >> validateSet = Validation.buildDefaultValidatorFactory()
                .getValidator()
                .validate(gwbaDto);
        if (!CollectionUtils.isEmpty(validateSet)) {
            String messages = validateSet.stream()
                    .map(ConstraintViolation::getMessage)
                    .reduce((m1, m2) -> m1 + ";" + m2)
                    .orElse("参数输入有误!");
            return ResultVo.builder().code(ResultConstants.FALSE).message(SYSTEM_ERROR_TSBAMESSAGE + messages).build();
        }
        return null;
    }

解决方法2

定义一个对象,将list封装进行,则验证就验证单个对象了。

@Data
public class ValidList<E> implements List<E> {
  @Valid
  private List<E> list = new ArrayList<>();
}
将  public ApiResponse receiveManualTranscoding(@Validated @RequestBody List<SdZmDto> sdZmDtos) 
改成
public ApiResponse receiveManualTranscoding(@Validated @RequestBody ValidList<SdZmDto> sdZmDtos) 

选择方案

解决方法1虽然冗余代码,但是符合需求,如果采用方法2,则需要将请求的json参数进行做调整。

 @PostMapping("/receiveManualTranscoding")
    @ResponseBody
    public ApiResponse receiveManualTranscoding(@RequestBody List<SdZmDto> sdZmDtos) {
        for(SdZmDto sdZmDto : sdZmDtos){
            ApiResponse apiResponse = null;
            if((apiResponse = validate(sdZmDto)) != null){
                return apiResponse;
            }
        }
        ajmApiService.receiveManualTranscoding(sdZmDtos);
        return ApiDataResponse.ofSuccess();
    }

    private ApiResponse validate(@Valid SdZmDto sdZmDto) {
        Set<ConstraintViolation<@Valid SdZmDto >> validateSet = Validation.buildDefaultValidatorFactory()
                .getValidator()
                .validate(sdZmDto);
        if (!CollectionUtils.isEmpty(validateSet)) {
            String messages = validateSet.stream()
                    .map(ConstraintViolation::getMessage)
                    .reduce((m1, m2) -> m1 + ";" + m2)
                    .orElse("参数输入有误!");
            return ApiResponse.ofFail(messages);
        }
        return null;
    }
    ```

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中字符串替换的几种常用方法总结

    Java中字符串替换的几种常用方法总结

    这篇文章主要介绍了Java中字符串替换的几种常用方法,包括String类的replace、replaceAll和replaceFirst方法,使用StringBuilder或StringBuffer类,自定义替换方法,以及使用第三方库如Apache Commons Lang,需要的朋友可以参考下
    2025-04-04
  • 解决JavaEE开发中字符编码出现乱码的问题

    解决JavaEE开发中字符编码出现乱码的问题

    下面小编就为大家带来一篇解决JavaEE开发中字符编码出现乱码的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 教你怎么用Java数组和链表实现栈

    教你怎么用Java数组和链表实现栈

    本篇文章为大家详细介绍了怎么用Java数组和链表实现栈,文中有非常详细的代码示例及注释,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • Mac系统上安装 JDK 8 最稳最全教程(Homebrew 方式)

    Mac系统上安装 JDK 8 最稳最全教程(Homebrew 方式)

    Homebrew是一个开源的包管理器,专为macOS(尽管也可以在Linux上使用)设计,用来简化在Mac操作系统上安装软件的过程,这篇文章主要介绍了Mac系统上使用Homebrew方式安装JDK8最稳最全教程的相关资料,需要的朋友可以参考下
    2026-04-04
  • Mybatis实现动态SQL编写详细代码示例

    Mybatis实现动态SQL编写详细代码示例

    这篇文章主要为大家详细介绍了Mybatis中动态SQL的编写使用,动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题,感兴趣想要详细了解可以参考下文
    2023-05-05
  • MyBatis 添加元数据自定义元素标签的实现代码

    MyBatis 添加元数据自定义元素标签的实现代码

    这篇文章主要介绍了MyBatis 添加元数据自定义元素标签的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Android/Java中创建类实例的各种模式实例代码

    Android/Java中创建类实例的各种模式实例代码

    这篇文章主要介绍了Android/Java中创建类实例各种模式的相关资料,包括New关键字、静态工厂方法、建造者模式、单例模式、依赖注入、抽象工厂模式、原型模式和Reflection,每个模式有其特点和适用场景,需要的朋友可以参考下
    2025-09-09
  • springmvc学习笔记-返回json的日期格式问题的解决方法

    springmvc学习笔记-返回json的日期格式问题的解决方法

    本篇文章主要介绍了springmvc学习笔记-返回json的日期格式问题的解决方法,解决了日期格式的输出,有兴趣的可以了解一下。
    2017-01-01
  • SpringBoot中的配置文件加载优先级详解

    SpringBoot中的配置文件加载优先级详解

    这篇文章主要介绍了SpringBoot中的配置文件加载优先级详解,springboot启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件,需要的朋友可以参考下
    2024-01-01
  • springboot实现发送QQ邮箱

    springboot实现发送QQ邮箱

    这篇文章主要为大家详细介绍了springboot实现发送QQ邮箱,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06

最新评论