Webclient 在未找到响应时返回 Optional.empty()

Webclient returning Optional.empty() on not found response

当我从服务器收到未找到的 404 时,我试图将 WebClient return 设为 Optional.empty()。但是我得到了一个带有 User 对象的 Optional,所有属性都设置为 null。

我错过了什么?

@Override
public Optional<User> getUser(Username username) {
    return webClient
            .get()
            .uri(buildUrl(username))
            .retrieve()
            .onStatus(HttpStatus.NOT_FOUND::equals, response -> Mono.empty())
            .onStatus(HttpStatus::is4xxClientError, response -> createError(response, CLIENTERROR))
            .onStatus(HttpStatus::is5xxServerError, response -> createError(response, SERVRERROR))
            .bodyToMono(User.class)
            .blockOptional();
}

您可以使用 Mono 中的 onError* 函数来处理这些情况。

onErrorResume 在异常时创建 empty/error Mono,onErrorMap 将异常转换为不同的异常类型。

例如:

@Override
public Optional<User> getUser(Username username) {
    return webClient
            .get()
            .uri(buildUrl(username))
            .retrieve()
            .onStatus(httpStatus -> httpStatus.is4xxClientError() && httpStatus != HttpStatus.NOT_FOUND, response -> createError(response, CLIENTERROR))
            .onStatus(HttpStatus::is5xxServerError, response -> createError(response, SERVRERROR))
            .bodyToMono(User.class)
            .onErrorResume(WebClientResponseException.NotFound.class, notFound -> Mono.empty())
            .blockOptional();
}

查看 WebClient Javadoc (javadoc) 中的示例代码。它正是使用 Mono 的 onErrorResume 方法:

 webClient.get()
   .uri("https://example.com/account/123")
   .retrieve()
   .bodyToMono(Account.class)
   .onErrorResume(WebClientResponseException.class,
        ex -> ex.getRawStatusCode() == 404 ? Mono.empty() : Mono.error(ex));