如何解析在GraphQL中实现接口的模式类型的数据?

时间:2018-05-09 10:19:21

标签: web-services spring-boot java-8 graphql graphql-java

我正在尝试使用graphql-java-8库开发spring boot graphQl服务。我从Web服务中获取数据,我从服务中得到的响应有点像动态,我必须在响应graphQl模式中引入graphQl接口。

extend type Query {
    search(
        name: String,
        category: String
    ): [ResultOne]
}

interface ResultOne {
    name: String
    content: String
}

type Fish implements ResultOne {
    name: String
    content: String
    weight: Float
}

type Fruit implements ResultOne {
    name: String
    content: String
    Color: String
}

type Toy implements ResultOne {
    name: String
    content: String
    description: String
}

使用graphQl框架连接我的模型,

return RuntimeWiring.newRuntimeWiring()
    .wiringFactory(new WiringFactory() {})
    .type(
          TypeRuntimeWiring.newTypeWiring("ResultOne")
          .typeResolver(env -> {
              if(env.getObject() instanceof Map) {
              Map object = env.getObject();
              if (object.containsKey("name") && object.get("name").equals("fish")) {
                return (GraphQLObjectType) env.getSchema().getType("Fish");
              } else if (object.containsKey("name") && object.get("name").equals("fruit")) {
                return (GraphQLObjectType) env.getSchema().getType("Fruit");            
              } else if(object.containsKey("name") && object.get("name").equals("toy")) {
                return (GraphQLObjectType) env.getSchema().getType("Toy");  
              } else {
                return null;
              }
          } else {
             return null;
          }
      })
  )
  .build();

因此,类型解决问题也是一种方法,不确定它是否理想。对于数据绑定,我不知道如何以graphQl的推荐方式执行此操作。我想补充一点,我为整个API提供了一个端点和单个提取器。数据在单个请求中获取,并且不想调用两次,因为我已经有完整的响应。我必须在运行时解析类型并为实现的模型连接数据。到目前为止,数据被完美地获取,并且值也在到我的查询的接口之前,但是对于接口实现的模型部分,例如:Fish,Fruit&在这个例子中玩具。我的问题是如何为java库动态解析类型数据?

请随时向我提出有关此问题的任何问题。

示例查询:

{
  search() {
    ResultOne {
      name
      content
      ... on Fish {
        weight  
      }
    }
  }
}

我目前得到的相应回应:

{
  "data": {
    "search": [
     {  
     "resultOne": [
          {
            "name": "Salmon", 
            "content": "Frozen Food",
            "weight": null
          }
        ]
      }
    ]
  },
  "extensions": {
    "Total-ResponseTime": 23020,
    "resultOne-Time": 22683
  }
}

0 个答案:

没有答案