spring - WebClient block 正在抛出 nullPointerException

标签 spring spring-boot spring-webflux

我有以下代码从另一个服务中获取用户详细信息。

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/

相关文章:

spring - 在 Tomcat 中热部署类文件

java - Spring AOP代理 session bean在 session 超时后保留,仅在容器重启后死亡

java - HTML - 有条件地选中复选框

tomcat - Spring Boot 中上下文路径的问题

json - Spring Boot json 在没有默认构造函数的情况下建模

spring-boot - 如何配置 Tomcat 以在 Azure 应用服务上使用 HTTP2?

postgresql - R2DBC邻接表获取所有 child

java - 关于 Spring MVC 与 bootstrap 的问题

java - 是否有可能在具有 Completable future 的 Java 中为 IO 密集型服务获得高吞吐量(4-5 TPS),或者 NodeJs 是更好的选择

java - 如何使用 webflux 处理 Spring Boot 2 中的 HTTP OPTIONS 请求?