Обработка исключений в StreamingResponseBody - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь поймать исключение, выброшенное в моей реализации StreamingResponseBody, я вижу, что исключение выдается внутри класса, однако выброшенное исключение не видимо для тела метода или моего совета контроллера.Так что ни одна из моих обработок, похоже, не работает, просто интересно узнать, как правильно обрабатывать исключения в этом случае.

@GetMapping(path = "/test", produces = "application/json")
public StreamingResponseBody test(@RequestParam(value = "var1") final String test)
        throws IOException{

    return new StreamingResponseBody() {

        @Override
        public void writeTo(final OutputStream outputStream) throws IOException{
            try {
                  // Some operations..
            } catch (final SomeCustomException e) {
                throw new IOException(e);
            }
        }
    };
}

Я бы ожидал, что мой ControllerAdvice вернет ResponseEntity со статусом Http, равным 500.

1 Ответ

0 голосов
/ 18 июня 2019

Лучший способ, который я обнаружил для обработки ошибок / исключений в веб-среде, - это создать собственное исключение с отключенной трассировкой стека и обработать его с помощью @ControllerAdvice.

import lombok.Getter;
import org.springframework.http.HttpStatus;

public class MyException extends RuntimeException {

    @Getter private HttpStatus httpStatus;

    public MyException(String message) {
        this(message, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    public MyException(String message, HttpStatus status) {
        super(message, null, false, false);
        this.httpStatus = status;
    }
}

А затем обработайте это в @ControllerAdvice так:

@ExceptionHandler(MyException.class)
public ResponseEntity handleMyException(MyException exception) {
    return ResponseEntity.status(exception.getHttpStatus()).body(
            ErrorDTO.builder()
                    .message(exception.getMessage())
                    .description(exception.getHttpStatus().getReasonPhrase())
                    .build());
}

, где ErrorDTO - это просто DTO с двумя полями:

@Value
@Builder
public class ErrorDTO {

    private final String message;
    private final String description;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...