Как я возвращаю пустое моно, если запрос не возвращает ошибку с помощью WebClient

#java #spring #api #spring-mvc #webclient

Вопрос:

я хочу знать, как вернуть пустое моно, когда я использую WebClient, у меня есть этот код, и он работает, когда запрос возвращает пользователя.

 public User getUserByUsername(String username) {  Monolt;Usergt; user = webClient.get().uri(uriBuilder -gt; uriBuilder  .path("localhost:8090/user"   "/getByUsername").queryParam("username", username).build())  .retrieve()  .bodyToMono(User.class);   User userRet = user.block();  return userRet;    }  

Ответ №1:

Прежде всего, не используйте block() , если вы действительно хотите в полной мере воспользоваться преимуществами использования реактивного стека. С его помощью вы блокируете поток, чтобы дождаться ответа, не делайте этого. Вместо этого вы всегда должны обрабатывать Mono и Flux в своем коде. Что-то вроде следующего:

 public Monolt;Usergt; getUserByUsername(String username) {  return webClient.get().uri(uriBuilder -gt; uriBuilder  .path("localhost:8090/user"   "/getByUsername").queryParam("username", username).build())  .retrieve()  .bodyToMono(User.class); }  

Затем вы можете указать, что вы хотите сделать, если ответ 4XX или 5XX. Ниже приведен пример для 5XX:

 public Monolt;Usergt; getUserByUsername(String username) {  return webClient.get().uri(uriBuilder -gt; uriBuilder  .path("localhost:8090/user"   "/getByUsername").queryParam("username", username).build())  .retrieve()  .onStatus(HttpStatus::is5xxServerError, response -gt; Mono.empty())  .bodyToMono(User.class); }