JSR-380-嵌套对象和FieldError ObjectName的Bean验证

时间:2020-03-05 10:27:48

标签: spring bean-validation

我有一个非常精确的要求。假设我有以下基本模型:

@ValidStudent
public class Student {
    private String firstName;
    private String gender;
    private List<@ValidCourse Course> courses;
}

public class Course {
    private String title;
    private LocalDate date;
    private String level;
}

@ValidCourse是一个简单的自定义注释,用于验证Course对象。

在我的Spring Boot应用程序中,有一个自定义@ExceptionHandler,它返回如下错误:

{
    "apierror": {
        "status": "BAD_REQUEST",
        "timestamp": "05-03-2020 11:00:09",
        "message": "Validation Error",
        "subErrors": [
            {
                "object": "Student",
                "field": "firstName",
                "rejectedValue": " ",
                "message": "firstName can't be blank. rejected value={" "}"
            },
            {
                "object": "Student",
                "field": "gender",
                "rejectedValue": "FOO",
                "message": "gender has not a valid value. rejected value={FOO}"
            },
            {
                "object": "Student",
                "field": "course[0].level",
                "rejectedValue": "BAR",
                "message": "level has not a valid value. rejected value={BAR}"
            }
        ]
    }
}

如果您查看apierror.subErrors [2] .object,那么一切似乎都可以正常运行,但您可能会注意到该对象是“ Student”,但我想返回“ Course”。在部门中,subError.object是ObjectError.objectName(相同程序包)中FieldError(程序包org.springframework.validation)的值。

我已经尝试按照以下方式在@ValidCourse级类上移动Course,但是在这种情况下,当{{1} }对象以POST发送:

Student

我认为最简单的解决方案是在提交List<Course>请求时在课程类级别触发@ValidCourse public class Course { private String title; private LocalDate date; private String level; } ,但是我不知道该怎么做:(目前,我的控制器请求是:

@ValidCourse

编辑

通过在控制器类级别添加POST,可以在课程级别上用@PostMapping public Student addStudent(@RequestBody @Valid Student student){ return studentService.save(student); } 验证@Validated对象。但是,它仍以List<Course>的形式返回@ValidCourse:(

EDIT-2 经过更多的研究,我几乎可以确定它将是复杂的配置。我的object: Student对象基于FieldError.objectName,该对象从同一包扩展了subError。此ObjectError Pojo将objectName定义为最终String。因此,没有二传手。另外,在javadoc org.springframework.validation.FieldError中:ObjectError 总而言之,我认为可以通过创建一些自定义配置类来实现,但是为了使我的应用程序易于维护并避免使用任何简单的解决方案,我暂时不会为此做任何事情。

非常感谢您的帮助:)

0 个答案:

没有答案