У меня очень точный запрос. Представьте, что у меня есть следующая модель 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.
В заключение я думаю, что это возможно путем создания некоторых пользовательских классов конфигурации, но для того, чтобы мое приложение было простым в обслуживании и без каких-либо простых решений, я не буду ничего делать для этого для момент.
Большое спасибо за вашу помощь:)