본문 바로가기

Spring

Spring Cloud Gateway Global Error Handler

728x90
반응형

ErrorWebExceptionHandler

spring-mvc에서는 ErrorController, AbstractErrorController, BasicErrorController가 기본적으로 제공되므로 

에러를 핸들링 할 수 있다. Spring-cloud는 webflux 기반이므로 mvc에서 사용하던 에러핸들러를 사용할 수 없다.

@ExceptionHandler 역시 사용이 불가능하다.

webflux에서 제공하는 에러핸들러는 ErrorWebExceptionHandler인터페이스와 AbstractErrorWebExceptionHandler, DefaultErrorWebExceptionHandler이다.

 


ErrorExceptionConfig.java

@Configuration
@RequiredArgsConstructor
public class ErrorExceptionConfig {
    private final ObjectMapper objectMapper;
    @Bean
    public ErrorWebExceptionHandler globalExceptionHandler() {
        return new GlobalExceptionHandler(objectMapper);
    }
}

ErrorWebExceptionHandler를 빈으로 등록하면 에러핸들러를 커스텀하여 사용할 수 있다.

GlobalExceptionHandler.java

@Slf4j
@Order(-1)
@RequiredArgsConstructor
public class GlobalExceptionHandler implements ErrorWebExceptionHandler {
    private final ObjectMapper objectMapper;

    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
        ServerHttpResponse response = exchange.getResponse();

        if (response.isCommitted()) {
            return Mono.error(ex);
        }

        response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
        if (ex instanceof ResponseStatusException) {
            response.setStatusCode(((ResponseStatusException) ex).getStatus());
        }

        Map<String, String> errorMap = new HashMap<>();
        String statusCode = Objects.requireNonNull(response.getStatusCode()).toString();
        if(statusCode.split(" ").length == 2) {
            errorMap.put("ErrorCode", response.getStatusCode().toString().split(" ")[0]);
            errorMap.put("ErrorMsg", response.getStatusCode().toString().split(" ")[1]);
        }

        String error = "Gateway Error";
        try {
            error = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(errorMap);
        } catch (JsonProcessingException e) {
            log.error("JsonProcessingException : " + e.getMessage());
        }

        byte[] bytes = error.getBytes(StandardCharsets.UTF_8);
        DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
        return exchange.getResponse().writeWith(Flux.just(buffer));
    }


}

ErrorWebExceptionHandler를 구현하면 된다.

handler메소드를 오버라이드하여 구현하면 된다.

 

응답 예시

{
    "ErrorMsg": "SERVICE_UNAVAILABLE",
    "ErrorCode": "503"
}
728x90
반응형