使用@Valid 校验嵌套对象

 更新时间:2021年10月20日 11:15:53   作者:mayner  
这篇文章主要介绍了使用@Valid 校验嵌套对象方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

@Valid 校验嵌套对象

参考网上的博客:ValidList 能校验list。

通过测试发现,@Valid只能校验一层。比如我这里有个person对象,里面有个ValidList<Teacher> 属性,Teacher对象里面有个List<Student> 属性。

如果在Controller层加上@Valid 是校验不到ValidList<Student> 属性的。

需要在List<Teacher> 属性前面加上 List<@Valid Teacher>

沾点代码:

package com.xiaoming.entity; 
import javax.validation.Valid;
import java.util.*; 
public class ValidList<E> implements List<E> { 
    @Valid
    private List<E> list = new ArrayList<>();
 
    @Override
    public int size() {
        return list.size();
    }
 
    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }
 
    @Override
    public boolean contains(Object o) {
        return list.contains(o);
    }
 
    @Override
    public Iterator<E> iterator() {
        return list.iterator();
    }
 
    @Override
    public Object[] toArray() {
        return list.toArray();
    }
 
    @Override
    public <T> T[] toArray(T[] a) {
        return list.toArray(a);
    }
 
    @Override
    public boolean add(E e) {
        return list.add(e);
    }
 
    @Override
    public boolean remove(Object o) {
        return list.remove(o);
    }
 
    @Override
    public boolean containsAll(Collection<?> c) {
        return list.containsAll(c);
    }
 
    @Override
    public boolean addAll(Collection<? extends E> c) {
        return list.addAll(c);
    }
 
    @Override
    public boolean addAll(int index, Collection<? extends E> c) {
        return list.addAll(index, c);
    }
 
    @Override
    public boolean removeAll(Collection<?> c) {
        return list.removeAll(c);
    }
 
    @Override
    public boolean retainAll(Collection<?> c) {
        return list.retainAll(c);
    }
 
    @Override
    public void clear() {
        list.clear();
    }
 
    @Override
    public E get(int index) {
        return list.get(index);
    }
 
    @Override
    public E set(int index, E element) {
        return list.set(index, element);
    }
 
    @Override
    public void add(int index, E element) {
        list.add(index, element);
    }
 
    @Override
    public E remove(int index) {
        return list.remove(index);
    }
 
    @Override
    public int indexOf(Object o) {
        return list.indexOf(o);
    }
 
    @Override
    public int lastIndexOf(Object o) {
        return list.lastIndexOf(o);
    }
 
    @Override
    public ListIterator<E> listIterator() {
        return list.listIterator();
    }
 
    @Override
    public ListIterator<E> listIterator(int index) {
        return list.listIterator(index);
    }
 
    @Override
    public List<E> subList(int fromIndex, int toIndex) {
        return list.subList(fromIndex, toIndex);
    }
 
    public List<E> getList() {
        return list;
    }
 
    public void setList(List<E> list) {
        this.list = list;
    } 
}
     @PostMapping("/test")
    public String testBytes(@Valid @RequestBody ValidList<Persion> persions){
        return "success";
    }  
 
@Data
public class Persion {
    @NotNull(message = "name != null")
    private String name;
    @NotNull(message = "teacherList != null")
    private ValidList<@Valid Teacher> teacherList;
} 
 
@Data
public class Teacher {
    @NotNull
    private String name;
    @NotNull
    private List<Student> students;
}

@Valid 嵌套对象验证不成功

controller:

@PostMapping("WSendList")
public ApiResult getList( @ApiParam(required = true) @Valid  @RequestBody  PageListIO<WSendIO> body) {
        ...
        return ApiResult.success();
    }

PageListIO对象:

在这里插入图片描述

WSendIO对象:

public class WSendIO implements Serializable{
    @NotNull(message = "字段 不能为空")
    private Integer isTest;
    ...
}

这样请求WSendIO中的验证时不会执行的

解决方案:在PageListIO中使用@Valid

在这里插入图片描述

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

相关文章

  • Java实现无损Word转PDF的示例代码

    Java实现无损Word转PDF的示例代码

    本文将利用Java中的两个jar包:pdfbox和aspose-words实现无损Word转PDF功能,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下
    2022-06-06
  • Java for循环的妙用之鸡兔同笼问题

    Java for循环的妙用之鸡兔同笼问题

    这篇文章主要给大家介绍了关于Java for循环的妙用之鸡兔同笼问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Spring Cloud Alibaba使用Nacos作为注册中心和配置中心

    Spring Cloud Alibaba使用Nacos作为注册中心和配置中心

    这篇文章主要为大家介绍了Spring Cloud Alibaba使用Nacos作为注册中心和配置中心的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 详解SpringBoot基于Dubbo和Seata的分布式事务解决方案

    详解SpringBoot基于Dubbo和Seata的分布式事务解决方案

    这篇文章主要介绍了详解SpringBoot基于Dubbo和Seata的分布式事务解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java并发包线程池ThreadPoolExecutor的实现

    Java并发包线程池ThreadPoolExecutor的实现

    本文主要介绍了Java并发包线程池ThreadPoolExecutor的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • springboot项目读取resources目录下的文件的9种方式

    springboot项目读取resources目录下的文件的9种方式

    本文主要介绍了springboot项目读取resources目录下的文件的9种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 在IDEA中创建跑得起来的Springboot项目

    在IDEA中创建跑得起来的Springboot项目

    这篇文章主要介绍了在IDEA中创建跑得起来的Springboot项目的图文教程,需要的朋友可以参考下
    2018-04-04
  • SpringBoot+MinIO实现对象存储方式

    SpringBoot+MinIO实现对象存储方式

    这篇文章主要介绍了SpringBoot+MinIO实现对象存储方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • SpringBoot集成Druid实现多数据源的两种方式

    SpringBoot集成Druid实现多数据源的两种方式

    这篇文章主要介绍了SpringBoot集成Druid实现多数据源的两种方式,集成com.baomidou的方式和基于AOP手动实现多数据源原生的方式,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • Java构造函数与普通函数用法详解

    Java构造函数与普通函数用法详解

    本篇文章给大家详细讲述了Java构造函数与普通函数用法以及相关知识点,对此有兴趣的朋友可以参考学习下。
    2018-03-03

最新评论