programing

Spring 5 Reactive에서의 HTTP 응답 예외 처리

telebox 2023. 6. 21. 22:30
반응형

Spring 5 Reactive에서의 HTTP 응답 예외 처리

저는 WebFlux 반응형 스타터와 함께 Spring Boot 2와 Spring 5를 사용하여 반응형 마이크로 서비스를 개발하고 있습니다.

다음과 같은 문제에 직면해 있습니다.다른 REST 서비스를 호출하여 수신하는 모든 HTTP 상태를 처리하고 일부 잘못된 HTTP 상태를 수신하면 예외를 적용합니다.예를 들어, 내가 엔드포인트를 호출하고 404 HTTP 상태를 수신할 때, 나는 예외를 던지고 그 예외를 일부 예외 핸들러 클래스에서 처리하려고 합니다. 마치 봄 4에서 처리했던 것처럼.@ControllerAdvice.

이를 위한 올바른 방법은 무엇입니까?좋은 제안을 받기를 바랍니다.

이 문제는 두 개의 독립적인 부분으로 해결할 수 있습니다.

WebClient에서 받은 HTTP 404 응답을 사용자 정의 예외로 변환하는 방법

사용 시WebClient원격 서비스에서 HTTP 404 응답을 수신할 수 있습니다.기본적으로 모두4xx그리고.5xx고객 응답이 다음으로 전환됩니다.WebClientResponseException따라서 WebFlux 앱에서 이러한 예외를 직접 처리할 수 있습니다.

404개의 응답만 사용자 지정 예외로 전환하려면 다음 작업을 수행할 수 있습니다.

WebClient webClient = //...
webClient.get().uri("/persons/1")
  .retrieve()
  .onStatus(httpStatus -> HttpStatus.NOT_FOUND.equals(httpStatus),
                        clientResponse -> Mono.error(new MyCustomException()))
  .bodyToMono(...);

이 작업은 분명히 클라이언트별 통화 기준으로 수행됩니다.

보다 재사용 가능한 방법으로 동일한 작업을 수행할 수 있습니다.ExchangeFilterFunction한 번만 설정할 수 있습니다.WebClient예를 들어 다음과 같습니다.

WebClient.builder().filter(myExchangeFilterFunction)...

WebFlux 앱에서 사용자 지정 예외를 처리하는 방법

주석이 있는 Spring WebFlux를 사용하면 주석이 달린 메서드로 예외를 처리할 수 있습니다.@ExceptionHandler(Spring Framework 참조 설명서 참조).

참고: 사용WebExceptionHandler가능하지만 높은 수준의 지원이 없기 때문에 상당히 낮은 수준입니다. 직렬화를 지원하지 않고 버퍼를 사용하여 수동으로 응답을 작성해야 합니다.

제 생각에 당신이 찾고 있는 것 같습니다.WebFluxResponseStatusExceptionHandler참조를 위해 이것을 확인합니다.

WebHandler API에서 WebExceptionHandler를 사용하여 WebFilter 체인과 대상 WebHandler의 예외를 처리할 수 있습니다.WebFlux Config를 사용할 때 WebExceptionHandler를 등록하는 것은 Springbean으로 선언하는 것과 선택적으로 Bean 선언에 @Order를 사용하거나 Order를 구현하여 우선 순위를 표현하는 것만큼 간단합니다.

예는 도움이 될 수 있습니다. 제가 직접 시도하지는 않았습니다.

@Component
@Order(-2)
class RestWebExceptionHandler implements WebExceptionHandler{

    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
        if (ex instanceof PostNotFoundException) {
            exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);

            // marks the response as complete and forbids writing to it
            return exchange.getResponse().setComplete();
        }
        return Mono.error(ex);
    }
}

class PostNotFoundException extends RuntimeException {
    PostNotFoundException(String id) {
        super("Post:" + id + " is not found.");
    }
}

언급URL : https://stackoverflow.com/questions/49648435/http-response-exception-handling-in-spring-5-reactive

반응형