我有以下代码从另一个服务中获取用户详细信息。
ParameterizedTypeReference<SuccessResponse<<User>> userTypeReference = new ParameterizedTypeReference<>() {}
User user = webClient.get()
.uri("url")
.retrieve()
.onStatus(HttpStatus::is4xxClientError, response -> Mono.empty())
.bodyToMono(userTypeReference)
.onErrorResume(e -> Mono.empty())
.doOnError(e -> logger.error("Error on fetching user details {}", e))
.map(response -> response.getData())
.block();
服务的响应如下所示:
{
"status": "success",
"data": {
"name": "John",
...
}
}
如果
data
元素不可用,映射返回 null 并且在 block()
上和 throw java.lang.NullPointerException: The mapper returned a null value
错误。我知道我们可以处理
nullPointerException
在映射期间并返回 new User
如果数据对象为空,则为对象。但我不想得到一个空对象。有什么方法可以使用 block()
获取空值?
最佳答案
Brian Clozel 的上述回答得到了很好的解释。我还找到了解决此问题的另一种方法。我们可以避免NullPointerException
通过在这种情况下过滤响应。
User user = webClient.get()
.uri("url")
.retrieve()
.onStatus(HttpStatus::is4xxClientError, response -> Mono.empty())
.bodyToMono(userTypeReference)
.onErrorResume(e -> Mono.empty())
.doOnError(e -> logger.error("Error on fetching user details {}", e))
.filter(response -> !Objects.isNull(response.getData()))
.map(response -> response.getData())
.block();
关于spring - WebClient block 正在抛出 nullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59090105/