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

标签 java json spring-boot graphql

使用 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对象?

最佳答案

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

{
  "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)

关于java - SpringBoot WebTestClient - 如何在graphql API中使用expectBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60656653/

相关文章:

java - Java 正则表达式需要进一步的帮助

java - 当我将 MainActivity 分成几个类时 Android 应用程序崩溃

java - 如何更改 mxgraph 中 mxCell 和 mxPoint 之间的边缘样式?

postgresql - 如何让 PostgreSQL DBLink 连接与 JDBC 一起工作?

java - Thread.yield() 被认为是有害的?

javascript - 无法从动态 json 获取数据

c# - 如何从 JArray 中选择元素的值

javascript - 将 JSON 数据从 Web API 映射到 KnockOut

java - 如何创建一个映射,其中多个值映射到 List<Map<String,Object> 中的同一键?

java - 如何使用 hibernate 读取地理值?