GraphQL-SPQR - ошибка со списком без обобщений

Моя схема 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;
    }
}

Используя Graphi 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() быть списком, но это, очевидно, не повлияло на шаг проверки.

Вопрос заключается в следующем: как настроить схему, чтобы она позволяла получателям возвращать неуниверсальные списки или карты?

0 ответов

Насколько я понимаю, в геттер нужно добавить @GraphQLQuery.

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

Как вы упомянули, возможно, вы не сможете это изменить. Одним из способов может быть создание объекта-оболочки, поэтому вместо возврата MyObject вы возвращаете MyWrapperObject, который принимает MyObject в конструкторе и имеет SPQR-совместимые методы получения для доступа к переменным. В качестве альтернативы есть @GraphQLContext, который вы можете использовать для добавления (без изменения класса) новых методов. Эти методы могут быть совместимы с SPQR.

надеюсь, это поможет

Другие вопросы по тегам