SpringBoot WebTestClient - 如何在 graphql API 中使用 expectBody

Posted

技术标签:

【中文标题】SpringBoot WebTestClient - 如何在 graphql API 中使用 expectBody【英文标题】:SpringBoot WebTestClient - How to use expectBody in graphql API 【发布时间】:2020-06-24 15:42:18 【问题描述】:

使用 REST API 和 Spring Boot WebTestClient,我可以轻松地从返回的 JSON 中获取解析的对象,如下所示:

  Person person = webTestClient
                .get()
                .uri("/person/3")
                .exchange()
                .expectBody(Person.class))
                .returnResult()
                .getResponseBody();

使用 graphql,json 被包装在一个数据属性中,如下所示:

 
  "data" : 
    "person" : 
      "name" : "Foo"
    

所以它不适用于

      ...
      .expectBody(Person.class))

因为 JSON 解析器以“data”而不是“data.person”开头。

如何实现直接解析JSON结果并返回Person对象?

【问题讨论】:

【参考方案1】:

GraphQL 具有默认的response 结构,任何成功的响应都会在data 块中返回,如下所示


  "data":  ... ,
  "errors": [ ... ]
 

所以使用@JsonRootName(value = "person") 并使用UNWRAP_ROOT_VALUE 功能配置ObjectMapper

@JsonRootName(value = "person")
public class Person 

  // properties

  

 ObjectMapper om = new ObjectMapper();
 om.enable(SerializationFeature.WRAP_ROOT_VALUE);
 om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true)

【讨论】:

但是如何将它与 webtestclient 连接起来? 看到这个只需将ObjectMapper设置为webtestclient***.com/questions/43769301/…@Janning

以上是关于SpringBoot WebTestClient - 如何在 graphql API 中使用 expectBody的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot WebTestClient - 如何在 graphql API 中使用 expectBody

spring boot:如何配置自动装配的 WebTestClient

WebTestClient - 带有 Spring Boot 和 Webflux 的 CORS

Spring boot - WebFlux - WebTestClient - 将响应转换为 responseEntity

Spring RequestContextHolder 和 WebTestClient

如何让 WebTestClient 注销所有请求 [重复]