본문 바로가기
IT/JAVA

webclient - bodyToMono 예외 처리

by 최고영회 2020. 11. 20.
728x90
반응형
SMALL

MSA 로 만들다 보니 Rest 형식으로 서로 데이터를 주고 받는 경우가 많은데

webclient 를 이용하여 rest api를 call 할때 404, 500 등의 오류에 대한 처리 방법을 알아 본다.

기존 코드

public User findByIdAndPassword(String id, String pw) { 
  return getWebClient().get()
            .uri(String.format(URI.FIND_NO_BY_ID_PW.get(), new Object[] {id, encryptParam(pw)}))
            .exchange()
            .bodyToMono(User.class);
            .block(); 
}

사용자 인증 API 에서는 id 가 없을 경우 404 NOT_FOUND 와 함께 데이터는 null 로 보내준다.

Controller 에서는 위 method 를 호출하고 return 받은 User 객체가 null 일 때

사용자에게 HttpStatus.NOT_FOUND 를 return 한다.

그런데 예상과는 다르게 Controller 에서 받은 User 객체가 null 이 아니였다.

bodyToMono 에서 데이터가 없을 경우 변환 시 새로운 객체를 만들어서 return 하기 때문이다.

변경된 코드

public User findByIdAndPassword(String id, String pw) { 
  return getWebClient().get() 
                       .uri(String.format(URI.FIND_NO_BY_ID_PW.get(), new Object[] {id, encryptParam(pw)})) 
                       .exchange() 
                       .flatMap(res -> { 
                         if (res.statusCode().value() == HttpStatus.NOT_FOUND.value()) { 
                           return Mono.empty(); 
                         } 
                         return res.bodyToMono(User.class); 
                       }) 
                       .block(); 
}

flatMap 을 이용하여 response 의 status code 를 확인하여 Mono.empty(); 를 return 해 준다.

만약 Mono.empty(); 를 return 하지 않고 return null; 하면

The mapper returned a null Mono .. 라는 에러 메시지와 함께 NPE 가 발생한다.

doOnError, onErrorReturn 등의 다양한 method 를 이용한 예외 처리고 가능하다.

 

728x90
반응형
LIST