#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); }