Graphql接受用户定义对象的列表

时间:2017-08-31 06:41:52

标签: java graphql graphql-java

我有一个要求,我必须接受对象列表。

变异类中的方法如下所示

@GraphQLMutation //1
    public void ack(@GraphQLInputField List<PingEntity> pingEntityList) { //2
        log.info("Handling ack calls.");        
        pingEntityRepository.savePingEntityList(pingEntityList);
    }

PingEntity看起来像这样

@Data
//@Document(collection="pingdatastore")
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class PingEntity {

    private String id;

    @JsonProperty("action")
    private String action;

    @JsonProperty("message")
    private String message;

    @JsonProperty("timestamp")
    private Long timestamp;

    @JsonProperty("transactionId")
    private String transactionId;

    @JsonProperty("type")
    private Integer type;

    private String imei;

}

我的查询看起来像这样

mutation ack {
  ack(pingEntityList: [{action: "KEEP-ALIVE2", message: "Keep alive message at regular intervals", timestamp: 1462747047}]) {
    id
  }
}

我得到了这样的错误:

"data": null,
  "errors": [
    {
      "validationErrorType": "SubSelectionNotAllowed",
      "message": "Validation error of type SubSelectionNotAllowed: Sub selection not allowed on leaf type Boolean",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "errorType": "ValidationError"
    }
  ]
}

我试着给出不同的注释。我无法解决这个问题..在这个问题上需要帮助

提前致谢:)

1 个答案:

答案 0 :(得分:1)

问题似乎是,由于缺少更好的选项,您的ack方法会返回void,并将其映射到boolean。由于boolean是一个简单的标量,因此您无法从中选择任何内容,并且您尝试在查询中选择id

如果您更改了ack方法以返回已保存的List<PingEntity>,那么您将获得所需的行为。

但是......更重要的是,您正在使用哪个库,因为我在代码中看到的注释(@GraphQLInputField)是来自graphql-java的 not (如graphql-java本身不提供注释),也不提供我认可的任何库。

它似乎来自一个非常古老且从未公开发布的graphql-spqr版本。如果确实如此,你绝对需要更新到最新版本,因为你似乎使用的版本充其量只是alpha质量。