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
반응형
'Spring' 카테고리의 다른 글
Spring cloud circuit breaker fallback 메소드 테스트 (0) | 2022.02.04 |
---|---|
Spring circuitbreaker actuator health check 설정 (0) | 2022.02.04 |
Spring @Valid 어노테이션으로 파라미터 검증하기 (0) | 2022.02.02 |
Spring boot + mariadb + mybatis + hikaricp 설정 (0) | 2022.02.02 |
Spring @Configuration @Bean 스프링 빈 등록 방법 (0) | 2022.01.30 |