Javax Validation 嵌套对象验证失效

5 篇文章 0 订阅
3 篇文章 0 订阅

先说结论:

对象A 嵌套 对象B,如果在校验 对象A 的属性的同时,也校验对象B的属性,那么要在对象B上也加上@Valid注解。

public class A {

     @Valid

     private B b;

}

一、场景分析

假设有如下两个对象,学生 Student 和 课程 Course,学生对象关联着课程对象。

现在我们想校验,学生对象的字段,以及它所关联的课程对象的字段。

我们使用了 javax @NotNull 注解。

package com.study.student.entity;
import lombok.Data;
import javax.validation.constraints.NotNull;
import com.study.course.entity.Course;

@Data
public class Student {
    @NotNull(message = "学生名称不能为空")
    private String studentName;
    private Course course;
}
---------------------------------------------
package com.study.course.entity;
import lombok.Data;
import javax.validation.constraints.NotNull;

@Data
public class Course {
    @NotNull(message = "课程名称不能为空")
    private String courseName;
    @NotNull(message = "教师名称不能为空")
    private String teacherName;
}

 现在有这样一个 Controller,我们在方法入参加上注解 javax @Valid,用来校验 Student。

我们希望不管 学生 Student 和 课程 Course 凡是加上 @NotNull 注解的属性,都能进行非空校验。

package com.study.student.controller;

import com.study.student.entity.Student;
import com.study.common.base.R;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
@RequiredArgsConstructor
@RequestMapping("student")
public class StudentController {

    @PostMapping("/selectCourse")
    public R<Void> selectCourse(@RequestBody @Valid Student student) {
        System.out.println(student);
        return R.success();
    }
}

访问测试

###
POST http://localhost:8080/student/selectCourse
Content-Type: application/json

{
  "studentName": "小林",
  "course": {
    "courseName": "高等数学",
    "teacherName": null
  }
}
输出:
Student(studentName=小林, course=Course(courseName=高等数学, teacherName=null))

 可以看到,虽然 course 对象 teacherName 属性空了,但是 javax 却没有给我们校验出来。

二、解决方法

给 Student 关联的 Course 对象,也加上 @Valid 注解

package com.study.student.entity;
import lombok.Data;
import javax.validation.constraints.NotNull;
import com.study.course.entity.Course;

@Data
public class Student {
    @NotNull(message = "学生名称不能为空")
    private String studentName;
    @Valid
    private Course course;
}

 现在再来访问测试:

###
POST http://localhost:8080/student/selectCourse
Content-Type: application/json

{
  "studentName": "小林",
  "course": {
    "courseName": "高等数学",
    "teacherName": null
  }
}
输出:
{
  "code": -1,
  "msg": "教师名称不能为空"
}

 三、结论

对象A 嵌套 对象B,如果在校验 对象A的属性的同时,也校验对象B的属性,那么要在对象B上也加上@Valid注解。

public class A {

     @Valid

     private B b;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值