0

我的 GraphQL 架构是:

//Schema generated from query classes
GraphQLSchema schema = new GraphQLSchemaGenerator()
        .withBasePackages("com.blah.blah")
        .withOperationBuilder(new DefaultOperationBuilder(DefaultOperationBuilder.TypeInference.UNLIMITED))
        .withOutputConverters((config, defaults) -> defaults.drop(ObjectScalarAdapter.class))
        .withResolverBuilders(new AnnotatedResolverBuilder())
        .withOperationsFromSingleton(myObjectQuery)
        .withTypeTransformer(new DefaultTypeTransformer(true, true))
        .withValueMapperFactory(new JacksonValueMapperFactory())
        .generate();

我定义了一个 GraphQLQuery:

@GraphQLQuery(name = "getMyObject")
public MyObject getMyObject() {}

它返回一个“MyObject”类

MyObject 类不使用泛型,定义如下(我无法更改),尽管我知道myList包含MyListType类型的对象:

public class MyObject {
    private List myList;
    public List getMyList() {
        return myList;
    }
}

使用 Graph i QL(假设字段有效):

{
  getMyObject() {
    id
    myList{
      myListTypeId
    }
  }
}

结果是:

{
  "errors": [
    {
      "message": "Validation error of type SubSelectionNotAllowed: Sub selection not allowed on leaf type null of field myList@ 'getMyObject/myList'",
      "locations": [
        {
          "line": 4,
          "column": 5
        }
      ]
    }
  ]
}

如何解决此错误?我添加了一个方面来强制 getMylist() 的返回结果成为一个 List,但显然这对验证步骤没有影响。

问题是:如何配置架构以允许返回非泛型列表或映射的 getter?

4

1 回答 1

0

据我了解,@GraphQLQuery 需要添加到 getter 中。

public class MyObject {
    private List myList;
    @GraphQLQuery(name = "myList")
    public List getMyList() {
        return myList;
    }
}

正如你提到的,你可能无法改变这一点。一种方法可能是创建一个包装器对象,因此不是返回 MyObject,而是返回 MyWrapperObject,它在构造函数中采用 MyObject 并具有与 SPQR 兼容的 getter 来访问变量。或者,还有@GraphQLContext,您可以使用它来添加(不更改类)新方法。这些方法可以与 SPQR 兼容。

希望有帮助

于 2019-06-26T09:22:27.947 回答