JSR-380 - проверка компонентов вложенного объекта и имя объекта FieldError - PullRequest
0 голосов
/ 05 марта 2020

У меня очень точный запрос. Представьте, что у меня есть следующая модель basi c:

@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]. Возможно, вы заметите, что объект является "Student "но я хочу вернуть" курс "вместо этого. В отделе subError.object - это значение FieldError (пакет org.springframework.validation) из ObjectError.objectName (тот же пакет).

Я уже пытался переместить @ValidCourse в класс уровня Course как следует, но в этом случае валидатор не запускается по запросу 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 на уровне класса курса. Но он все равно возвращает object: Student как FieldError.objectName: (

EDIT-2 После дополнительных исследований я почти уверен, что это будет сложная конфигурация для настройки. Мои subError объекты основаны на org.springframework.validation.FieldError, который расширяет ObjectError из того же пакета. ObjectError Pojo определяет objectName как окончательную строку. Так что нет никакого установщика. Также в jav ado c getObjectName(): Return the name of the bound root object. В заключение я думаю, что это возможно путем создания некоторых пользовательских классов конфигурации, но для того, чтобы мое приложение было простым в обслуживании и без каких-либо простых решений, я не буду ничего делать для этого для момент.

Большое спасибо за вашу помощь:)

...