Я передаю объект (проект) из моего интерфейса React моему контроллеру Spring Boot, затем в службу, где я проверяю проект.У меня работает проверка, и на бэкэнде все гладко, но я сталкиваюсь с проблемой при отправке моего ответа на проверку от бэкэнда обратно во внешний интерфейс.Вот мой Spring-контроллер:
@RequestMapping(value="/validate", method = POST, produces = APPLICATION_JSON_VALUE)
public void validate(@RequestBody Project project, BindingResult result) {
projectsService.validate(project, result);
if(result.hasErrors()) {
throw new ValidationException("invalidProject", result);
}
}
Это метод контроллера, который я использую, и я хочу сохранить эту же структуру (поскольку я не хочу ничего возвращать, я хочу вызвать исключение ValidationExceptionесли проект недействителен и перехватывает его во внешнем интерфейсе).
Как вы можете видеть, я передаю bindingResult (который содержит всю информацию о проверке) моей исключительной ситуации ValidationException, которую я создал.
НО, когда я получаю сообщение об ошибке во внешнем интерфейсе, этотindingResult исчез, и единственное, что видно, это сообщение об исключении (invalidProject), вложенное в обычный колосс кодов ошибок.Это ответ, который я имею в виду:
<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.32 - Error report</title><style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style> </head><body><h1>HTTP Status 500 - Request processing failed; nested exception is com.oreillyauto.pricingweb.ofmprojectadmin.commons.exceptions.ValidationException: invalidProject</h1><div class="line"></div><p><b>type</b> Exception report</p><p><b>message</b> <u>Request processing failed; nested exception is com.oreillyauto.pricingweb.ofmprojectadmin.commons.exceptions.ValidationException: invalidProject</u></p><p><b>description</b> <u>The server encountered an internal error that prevented it from fulfilling this request.</u></p><p><b>exception</b></p><pre>org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.oreillyauto.pricingweb.ofmprojectadmin.commons.exceptions.ValidationException: invalidProject
Так что это просто продолжается и продолжается, а затем сопровождается следом стека ... Здесь лежит мой вопрос.Почему сам объект Exception не отправляется внешнему интерфейсу?Если это то, где это может быть, я просмотрел каждое слово ответа и не могу его найти.Если объект не отправляется во внешний интерфейс, есть ли способ сделать это?
Все, что я нашел в валидационной документации Spring, направлено на обработку ошибок в бэкэнде или просто на отклонение запроса без дополнительныхинформация, но я хочу отобразить соответствующую информацию проверки на веб-интерфейсе (то есть, какие поля отсутствуют в проекте).
Вот мой сервис Axios внешнего интерфейса:
static ValidateProject(project) {
return axios.post(BASE_URL + 'project/validate/', project)
.then(response => response.data)
.catch(error => {
console.log(error.response.data)
ExceptionService.handle(error)
})
}
А вот мойПользовательское исключение:
public class ValidationException extends RuntimeException {
private static final long serialVersionUID = 3124218441365707050L;
private BindingResult bindingResult;
public ValidationException(String message, BindingResult bindingResult) {
super(message);
this.bindingResult = bindingResult;
}
public BindingResult getBindingResult() {
return bindingResult;
}
public List<ValidationErrorItem> getValidationErrors() {
List<ValidationErrorItem> errorItems = new ArrayList<>();
for (ObjectError next : bindingResult.getAllErrors()) {
String field = null;
if (next instanceof FieldError) {
FieldError fieldError = (FieldError) next;
field = fieldError.getField();
}
errorItems.add(new ValidationErrorItem(field, next.getCode(), next.getDefaultMessage()));
}
return errorItems;
}
}