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));
当我从服务器收到未找到的 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));