WebClient에서 Error를 Handling해보신 적이 있으신가요?
난 몰랐지 없었습니다. 없었는데 생겼지 뭐.
아 거꾸로네
지금 작업중인 내 API에서는 때때로 다른 API로 요청을 보내 처리해야 하는데, 그 조건이 좀 정책적으로 모시깽한? 부분이 있다.
뭐 이런 건데, 사실 딱히 모시깽하지는 않은 것 같은데 그냥 안해봐가지고 할 때만 좀 헷갈린 듯?
아무튼 기존에 요청을 보낼 때는 이렇게 보냈다.
Response<List<Response>> response = WebClient
.create(url)
.get()
.uri(uriBuilder -> uriBuilder.path("/uripath")
.queryParam("param", String.join(",", paramlist))
.build())
.accept(MediaType.APPLICATION_JSON_UTF8)
.retrieve()
.onStatus(HttpStatus::is4xxClientError, clientResponse -> clientResponse.bodyToMono(String.class).map(Exception::new))
.bodyToMono(new ParameterizedTypeReference<Response<List<Response>>>() {
})
.block();
일부 사용하고 있는 애는 좀 편집함.
해서 요청 스테이터스에 따라서 사용자에게도 에러를 바로 내려주는 방식. 이어서 나도 별로 신경쓸 것 없고 좋았는데,
이제는 요구사항이 달라졌지? 그럼 로직이 달라지겠지? 그럼 코드가 바뀌겠지?
새삼 이제보니까 좀 혐짤이네
이거로 간다
해서 이러쿵 저러쿵 에러 처리하는 방법을 이것저것 찾아봤는데, 잘 안되다가 아무튼 되는걸 찾았지 뭐야? 이것이 정보의 바다?
해서 기록인지 공유인지 아무튼 하자면
1. 삭제해서 진행 안되는 경우 돌려보내는 케이스
webClient
.delete()
.uri("/api/manage/" + key)
.accept(MediaType.APPLICATION_JSON_UTF8)
.header("Authorization", this.login())
.retrieve()
.onStatus(HttpStatus::isError, clientResponse -> clientResponse.bodyToMono(String.class)
.flatMap(error ->
Mono.error(ApiException.builder()
.errorMessage(error)
.errorCode("ERROR")
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.build())))
.bodyToMono(String.class)
.block();
Onstatus를 통해서 기존에 핸들링 하던거랑 비슷한 방식으로 하면 잘 됨. 물론 중간에 에러 잡는 부분도 바뀌고, Mono로 까서 errorMessage도 맛깔나게 내려드렸습니다 네
그리고
2. 수정해서 진행 안돼도 내 할일 알아서 하는 케이스 내알아할게~
webClient
.patch()
.uri("/api/manage/")
.accept(MediaType.APPLICATION_JSON_UTF8)
.header("Authorization", this.login())
.bodyValue(UpdateRequest)
.retrieve()
.bodyToMono(String.class)
.onErrorResume(throwable -> {
log.error("ERROR");
return Mono.empty();
})
.block();
}
바로바로 onErrorResume! 어라 not같애 아무튼
onErrorResume을 쓰면, 글자 읽을 줄 알면 알다시피 error가 on일 때 resume 하더라고 그냥 쿨 그자체
그것이 resume이니까.
아무튼 몇 시간 걸려서 열심히 찾았던 내용인데, 이렇게 맛깔나고 깔끔하게 처리가 잘 되더라는 말이야!
말
끗.