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
'IT > JAVA' 카테고리의 다른 글
Netty 란 (0) | 2021.02.02 |
---|---|
jmap 오류 발생할 경우 - Unable to open socket file, HotSpot VM not loaded (0) | 2020.12.01 |
Synchronized 잘 알고 사용하기 (0) | 2020.11.05 |
ServletFilter 를 이용한 Download File 분석 (0) | 2020.09.29 |
Cannot deserialize value of type `java.time.LocalDateTime` from String.... `0000-00-00 00:00:00` 처리 방법 (3) | 2020.06.11 |