在SpringBoot中自定义列表验证

Custom Validation of lists in SpringBoot

提问人:coconut 提问时间:11/15/2023 更新时间:11/16/2023 访问量:38

问:

我有一个简单的对象:

public class Student {
    private int id;

    @Max(18)
    @Min(3)
    private int age;
}

我的休息控制器会收到一份学生名单。如何验证最小和最长年龄,以及列表中的 ID 是否重复?

我尝试编写自己的验证器,但它不起作用。

public class StudentsValidator implements ConstraintValidator<ValidStudents, List<Student>> {

    @Override
    public void initialize(ValidStudents constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }

    @Override
    public boolean isValid(List<Student> students, ConstraintValidatorContext constraintValidatorContext) {
        if (students == null || students.isEmpty())
            return true;
    
        if (students.stream().anyMatch(students -> students.getAge() < 3 || students.getAge() > 18))
            return false;
    
        return students.stream().map(Student::getID).distinct().count() == students.size();
    }
}

我的注释:

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = StudentsValidator.class)
public @interface ValidStudents {
    String message() default "Invalid list of students";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

然后在我的控制器中,我像这样使用它:

public void putStudents(@RequestBody @ValidStudents List<@Valid Student> students)

我假设如果我的@ValidStudents有效,我不需要在学生之前运行@Valid,但我正在尝试两者,但都不起作用。我错过了什么?

另外,除了编写自定义异常处理程序之外,我还可以在验证失败后抛出错误的请求吗?

提前致谢!

Java spring-boot REST 验证

评论

0赞 phuongnq1995 11/15/2023
添加到控制器类级别以启用 AOP 验证。请参阅此帖子@Validated

答:

0赞 coconut 11/15/2023 #1

这奏效了。我最终取下了@Valid,离开了@ValidStudents。我的 intellij 没有接受更改,所以我认为它不起作用。

而且正如@phuongnq1995所说,请确保您的控制器中具有类级别的@Validated。