Передача данных с пользовательским исключением из Spring Controller в Axios Frontend - PullRequest
0 голосов
/ 20 февраля 2019

Я передаю объект (проект) из моего интерфейса 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...