在SpringBoot中自定义列表验证

vd8tlhqk  于 2023-11-17  发布在  Spring
关注(0)|答案(1)|浏览(117)

我有一个简单的目标:

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可以工作的话,我就不需要在Student之前运行@Valid了,但是我两个都试了,两个都不行。我错过了什么?
另外,除了编写自定义异常处理程序之外,在验证失败后,我还能抛出一个错误的请求吗?
提前感谢!

pjngdqdw

pjngdqdw1#

这很有效。我最终删除了@Valid,留下了@ValidStudents。我的intellij没有接收到更改,所以我认为它不起作用。
正如@phuongnq1995所说,确保您的控制器中有类级别的@Validated。

相关问题