如何解析和编组 GraphQL 对 Java POJO 的响应?

Posted

技术标签:

【中文标题】如何解析和编组 GraphQL 对 Java POJO 的响应?【英文标题】:How to Parse & Marshal GraphQL Response to Java POJOs? 【发布时间】:2018-10-25 21:11:52 【问题描述】:

GraphQL 新手...

我正在向第三方控制的外部服务器发送 GraphQL 查询。

使用这个 GraphQL 查询:

query Photos($first: Int!, $propertyId: String) 
  viewer 
    content 
      contentLists(first: $first, property_id: $propertyId, contentListType: IMAGE, publishState: PUBLISHED, orderBy: originalPublishDate, orderByDirection: DESC) 
        edges 
          node 
            id
            title
            caption
            originalPublishDate
            lastModifiedDate
            contents(first: $first) 
              edges 
                node 
                  id
                  title
                  caption
                  type
                  ... on Image 
                    asset 
                      createdDate
                      lastModifiedDate
                      id
                      url
                      title
                      height
                      width
                    
                  
                
              
            
          
        
      
    
  

查询变量:


  "propertyId" : "23456832-7862-5679-4342-415f32385830",
  "first": 20

使用此代码 sn-p,我可以向外部服务器发送查询:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer "+accessToken);

HttpEntity<String> entity = new HttpEntity<String>(request,headers);
String response = restTemplate.postForObject(EXTERNAL_URL, entity, String.class);

收到以下回复:


"data": 
    "viewer": 
        "content": 
            "contentLists": 
                "edges": [
                
                    "node": 
                    "id": "3510e8f7-452s-f531-43b0-ac36ba979e5a9f4m",
                    "title": "Homer Simpson goes Camping",
                    "caption": "Homer Simpson goes Camping",
                    "originalPublishDate": "2018-02-18T03:31:56.352Z",
                    "lastModifiedDate": "2018-02-18T03:32:13.530Z",
                    "contents": 
                        "edges": [
                        
                            "node": 
                                "id": "3506d951-1332-86fg-42bc-b11183db50394f40",
                                "title": "No Title",
                                "caption": "",
                                "type": "IMAGE",
                                "asset": 
                                    "createdDate": "2018-02-18T03:31:38.406Z",
                                    "lastModifiedDate": "2018-02-18T03:31:38.991Z",
                                    "id": "65037262-7169-7065-7861-7035676a6f65323467617866",
                                    "url": "",
                                    "title": "No Title",
                                    "height": null,
                                    "width": null
                                
                            
                        
                    ]
                
            
         
      ]
    
  

使用这些 Java 库:

<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-java</artifactId>
    <version>8.0</version>
</dependency>

<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-java-tools</artifactId>
    <version>5.0.0</version>
</dependency>

如何编组对 POJO 和/或 POJO 的 ArrayList 的响应?

是否有一组更好的库可以帮助我使用 Java 解析/编组 GraphQL?

顺便说一句,第 3 方服务器不提供 GraphQL 架构文件...

【问题讨论】:

这没有帮助吗? baeldung.com/graphql @TarunLalwani - 如果我告诉您外部服务器已关闭并且不提供 GraphQL 模式文件,这对我有何帮助。他们的代表告诉我本地解析 JSON。您提供的教程提供了架构/IDL。尽管如此,还是感谢您与我们联系。 我认为您仍然需要自己创建 POJO,因为您知道这些字段。因为库无法知道将其分解为多少个对象。或者您只需使用 jackson 库并将其映射到响应数据中的 POJO。 baeldung.com/jackson-object-mapper-tutorial。如果架构不存在,那么 POJO 需要以单向或其他方式描述 我的同情@PacificNW_Lover。就像他们不想让他们的服务被轻易使用一样。 【参考方案1】:

如果您只需要生成一次这些类并在之后的每次调用中使用它们,那么您可以下载 JSON 到 POJO 映射工具。有很多实用程序可用;只是在快速搜索中,我找到了几个选项:

Convert XML or JSON to Java Pojo Classes - Online Json2Pojo Intellij Plugin

一旦你有了 POJO 类,你就可以使用标准的 jackson 映射器来获取类

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer "+accessToken);

HttpEntity<String> entity = new HttpEntity<String>(request,headers);
String rawResponse = restTemplate.postForObject(EXTERNAL_URL, entity, String.class);

ObjectMapper objectMapper = new ObjectMapper();
PhotoQueryResponse response = objectMapper.readValue(rawResponse, PhotoQueryResponse.class);

【讨论】:

对不起,我已经知道这些工具了。我在问是否有办法使用 graphql-java 库进行编组。 @PacificNW_Lover 我也有同样的问题,所以我决定建立自己的库来帮助解析graphQL响应和查询,你可以在这里查看github.com/daviestobialex/bpd-grapgql-parser,它还没有完成但是这是一项正在进行的工作【参考方案2】:

您可以查看这个名为的 java 库,

Glitr (GraphQL to Java) ,以及here 中的手册。

这是它支持的甜蜜类型,

GraphQLString           String
GraphQLBoolean          Boolean
GraphQLInt              Integer
GraphQLFloat            Float
GraphQLObjectType       Any POJO
GraphQLInterfaceType    Any interface type
GraphQLUnionType        Not supported
GraphQLEnumType         Any enum type
GraphQLInputObjectType  Any POJO
GraphQLList             Any implementing class of Collection
GraphQLNonNull          See @GlitrNonNull

【讨论】:

以上是关于如何解析和编组 GraphQL 对 Java POJO 的响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GraphQL Java 中解析多个模式文件

GraphQL with Java - 如何将解析器分成多个类

如何使用 apollo / graphql 实现节点查询解析器

使用 GraphQL 的 Angular2 服务和路由解析器

Java 中解析 XML 生成 Bean 实例,用啥方式效率最高?

JAXB - java xml解析