Web 客户端在未找到响应时返回 Optional.empty()

hel*_*ldt 3 java spring-webclient

当我从服务器收到 404(未找到)时,我试图WebClient返回一个Optional.empty()。但相反,我得到了一个 OptionalUser对象,所有属性都设置为 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();
}
Run Code Online (Sandbox Code Playgroud)

小智 5

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

onErrorResume在异常上创建一个空/错误 MonoonErrorMap并将异常转换为不同的异常类型。

例如:

@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();
}
Run Code Online (Sandbox Code Playgroud)