使用@Valid 校验嵌套对象

目录
  • @Valid 校验嵌套对象
  • @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

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

(0)

相关推荐

  • 使用@Validated和@Valid 解决list校验的问题

    目录 @Validated和@Valid 解决list校验 @validated验证List参数 写了个接口 ValidList @Validated和@Valid 解决list校验 在 Controller 类上 加上@Validated.在需要校验的参数上加上 @Valid . 就可以校验list里的实体类的属性 @validated验证List参数 写了个接口 @GetMapping("/do") public int doSth(@RequestBody @Validated(

  • springboot @Valid注解对嵌套类型的校验功能

    @Valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能,具体的代码如下,是最基本的应用: 实体: public class DepartmentDto { @ApiModelProperty("id") private String id; @ApiModelProperty("上级Id") private String parentId; @ApiModelPr

  • @Valid 无法校验List<E>的问题

    目录 @Valid 无法校验List<E> 原因 方法 @validated 验证List 反面例子 解决方法 @Valid 无法校验List<E> 原因 @Valid只能校验JavaBean,而List<E>不是JavaBean所以校验会失败,尝试了三种解决办法,比较推荐方法3,其他两种大家也可以学习一下. 方法 方法1:对List进行Wrapper 既然List不是JavaBean,那我们就把它封装成JavaBean,我们定义一个ListWrapper类如下: pa

  • 解决@Validated注解无效,嵌套对象属性的@NotBlank无效问题

    目录 @Validated注解无效,嵌套对象属性的@NotBlank无效 步骤 内层对象无法验证 @Validated注解不生效问题.如何使用 1.需要引入的包 2.将@Validated打在controller中需要验证的实体类前面 3.在具体实体类中定义字段的验证规则 4.数据格式校验 在controller中的方法中进行单个参数校验注意事项 @Validated注解无效,嵌套对象属性的@NotBlank无效 最近在做的公司项目是一个表单系统,刚好要用到@Validated注解来对表单字段进

  • 参数校验Spring的@Valid注解用法解析

    参数校验Spring的@Valid注解 @Valid 注解通常用于对象属性字段的规则检测. 以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid 注解用法详解. 那么,首先,我们会有一个员工对象 Employee,如下 : public class Employee { /** 姓名 */ public String name; /** 年龄 */ public Integer age; public String getName() { return name; } publ

  • 使用@Valid 校验嵌套对象

    目录 @Valid 校验嵌套对象 @Valid 嵌套对象验证不成功 @Valid 校验嵌套对象 参考网上的博客:ValidList 能校验list. 通过测试发现,@Valid只能校验一层.比如我这里有个person对象,里面有个ValidList<Teacher> 属性,Teacher对象里面有个List<Student> 属性. 如果在Controller层加上@Valid 是校验不到ValidList<Student> 属性的. 需要在List<Teache

  • @Valid 校验无效,BindingResult未获得错误的解决

    目录 @Valid 校验失效 问题描述 解决过程 使用bindingResult做参数校验 在控制类中 实体类OrderForm @Valid 校验失效 问题描述 使用@Valid校验实体类中的属性stuTele import javax.validation.constraints.Size; ... @Size(min = 11,max = 11,message = "请输入11位手机号码") private String stuTele; Controller中,用@Valid注

  • Ruby中嵌套对象转换成json的方法

    JSON由于其数据结构简单便利,已逐渐成为了互联网上的主流数据交换的数据格式. 在讨论嵌套对象(Nested Object)的JSON转换方法之前,我们先看简单的ruby JSON转换.首先,ruby对象转换为JSON字符串: 复制代码 代码如下: class Obj1 def initialize(var1) @var1 = var1 end def to_json(*a) { "json_class" => self.class, "data" =>

  • 在JavaScript中如何访问暂未存在的嵌套对象

    前言 JavaScript 是个很神奇的东西.但是 JavaScript中的一些东西确实很奇怪,让人摸不着头脑.其中之一就是当你试图访问嵌套对象时,会遇到这个错误 Cannot read property 'foo' of undefined 在大多数情况下,处理嵌套的对象,通常我们需要安全地访问最内层嵌套的值. 来个粟子: const user = { id: 101, email: 'jack@dev.com', personalInfo: { name: 'Jack', address:

  • 复杂JSON字符串转换为Java嵌套对象的实现

    目录 背景 方法 预备工作 构建对象模型 使用jackson 库解析 使用GSON解析 不含列表的嵌套对象 背景 实际开发中,常常需要将比较复杂的 JSON 字符串转换为对应的 Java 对象.这里记录下解决方案. 如下所示,是入侵事件检测得到的 JSON 串: [{"rule_id":"反弹shell","format_output":"进程 pname 反向连接到 %dest_ip%:%dest_port%","

  • 使用@RequestBody配合@Valid校验入参参数

    目录 @RequestBody配合@Valid校验入参参数 自定义一个Controller 自定义实体类 自定义全局异常处理器 附录 @Valid校验@RequestBody的参数 希望通过注解校验post请求的body 在request实体类添加注解进行校验 可以返回注解配置的错误信息 @RequestBody配合@Valid校验入参参数 自定义一个Controller import com.example.demo.pojo.User; import org.springframework.

  • reactive readonly嵌套对象转换功能实现详解

    目录 一.单元测试 reactive readonly 二.代码实现 一.单元测试 reactive // src/reactivity/tests/reactive.spec.ts it('nested reactive', () => { const original = { nested: { foo: 1 }, array: [{ bar: 2 }] }; const observed = reactive(original); expect(isReactive(observed.ne

  • 详解Spring AOP 实现“切面式”valid校验

    why: 为什么要用aop实现校验? answer: spring mvc 默认自带的校验机制 @Valid + BindingResult, 但这种默认实现都得在Controller方法的中去接收BindingResult,从而进行校验. eg: if (result.hasErrors()) { List<ObjectError> allErrors = result.getAllErrors(); List<String> errorlists = new ArrayList

  • vue elementUI 表单校验的实现代码(多层嵌套)

    嵌套对象的校验 项目中使用的vue+elementUI进行开发,已经用了有一段时间了,感觉表单校验是每一个前端开发人员都避免不了的需求.在一些前端可以自行校验的情况下,先通过前端校验,校验不通过不发送请求,直到满足校验规则,再发送请求给后端,从而提升用户体验. elementUI对表单的校验有自己的方法,要求传入model的必须为一个对象.但如果数据结构比较复杂,对象里面又嵌套对象,该如何校验?本文给出多层对象嵌套的方法. example <template> <el-form :mod

随机推荐