解决@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;
    }
    ```

总结

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

相关文章

  • springboot短信验证码登录功能的实现

    springboot短信验证码登录功能的实现

    这篇文章主要介绍了springboot短信验证码登录功能的实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Java Callable接口实现细节详解

    Java Callable接口实现细节详解

    这篇文章主要介绍了Java Callable接口实现细节详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 在Springboot中Mybatis与Mybatis-plus的区别详解

    在Springboot中Mybatis与Mybatis-plus的区别详解

    MyBatis是一个优秀的持久层框架,它对JDBC的操作数据库的过程进行封装,MyBatisPlus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生,本文将给大家介绍了在Springboot中Mybatis与Mybatis-plus的区别
    2023-12-12
  • Maven设置使用自定义的jar包到自己本地仓库

    Maven设置使用自定义的jar包到自己本地仓库

    今天小编就为大家分享一篇关于Maven设置使用自定义的jar包到自己本地仓库的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Java设计模式编程中的工厂方法模式和抽象工厂模式

    Java设计模式编程中的工厂方法模式和抽象工厂模式

    这篇文章主要介绍了Java设计模式编程中的工厂方法模式和抽象工厂模式,设计模式的建立有利于团队协作时代码的共同维护,需要的朋友可以参考下
    2016-01-01
  • Java中 equals 重写时为什么一定也要重写 hashCode

    Java中 equals 重写时为什么一定也要重写 hashCode

    这篇文章主要介绍了Java中 equals 重写时为什么一定也要重写 hashCode,equals 方法和 hashCode 方法是 Object 类中的两个基础方法,它们共同协作来判断两个对象是否相等,所以之间到底有什么联系呢,接下来和小编一起进入文章学习该内容吧
    2022-05-05
  • Spring很常用的@Conditional注解的使用场景和源码解析

    Spring很常用的@Conditional注解的使用场景和源码解析

    今天要分享的是Spring的注解@Conditional,@Conditional是一个条件注解,它的作用是判断Bean是否满足条件,本文详细介绍了@Conditional注解的使用场景和源码,需要的朋友可以参考一下
    2023-04-04
  • Java线程池必知必会知识点总结

    Java线程池必知必会知识点总结

    这篇文章主要给大家介绍了关于Java线程池必知必会知识点的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • SpringBoot实现License生成和校验的过程详解

    SpringBoot实现License生成和校验的过程详解

    在我们向客户销售商业软件的时候,常常需要对所发布的软件实行一系列管控措施,诸如验证使用者身份、软件是否到期,以及保存版权信息和开发商详情等,所以本文给大家介绍了SpringBoot实现License生成和校验的过程,需要的朋友可以参考下
    2024-09-09
  • Java单例模式继承覆盖多态原理详解

    Java单例模式继承覆盖多态原理详解

    这篇文章主要介绍了Java单例模式继承覆盖多态原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论