Получить исходное имя поля на GraphQL

Я использую https://github.com/leangen/graphql-spqr с java-приложением с весенней загрузкой. Я могу легко добраться до псевдонима, но как мне добраться до исходного fieldName?

       class Food {
   @GraphQLQuery(name = "aliasNameX", description = "A food's name")
   private String originalName; 
   ...
 }

  ....

  @GraphQLQuery(name = "foods") // READ ALL
   @Override
   public List<Food> getFoods(@GraphQLEnvironment ResolutionEnvironment env) {
       DataFetchingFieldSelectionSet selectionSet = env.dataFetchingEnvironment.getSelectionSet();
       List<SelectedField> fields = selectionSet.getFields();
       for (SelectedField f: fields)
       {
           System.out.println(f.getName());
       }
       return foodRepository.findAll();
   }

Когда я запускаю этот код, вывод выглядит как с полями псевдонима: «aliasNameX», ..., но мне нужно исходное имя, например «originalName». Как это сделать?

Решено, согласно:

https://github.com/leangen/graphql-spqr/issues/381

1 ответ

Публикую свой исходный ответ и здесь.

Вам нужны базовые имена полей, но с уровня выше. Еще можно, но некрасиво :(

      for (SelectedField selectedField : env.dataFetchingEnvironment.getSelectionSet().getImmediateFields()) {
    Optional<Operation> operation = Directives.getMappedOperation(selectedField.getFieldDefinition());
    String javaName = operation.map(op -> ((Member) op.getTypedElement().getElement()).getName()).orElse(null);
}

Но будьте очень осторожны. Если для поля GraphQL доступно более одного элемента Java, getTypedElement().getElement()взорвется. Чтобы быть уверенным, что тебе придется позвонить getTypedElement().getElements() (множественное число) и решите, что делать. ClassUtils#getPropertyMembers также может быть полезно, или ClassUtils.findXXX семейство методов.

В основном вам нужно сделать это:

      List<AnnotatedElement> elements = getTypedElement().getElements();
//Look for a field and use its name
Optional<String> field = Utils.extractInstances(elements, Field.class).findFirst().map(Field::getName);
//Look for a getter and find its associated field name
Optional<String> getter = Utils.extractInstances(elements, Method.class).findFirst().map(ClassUtils::getFieldNameFromGetter);

Этот API, возможно, придется изменить в будущем, поскольку инструменты на основе SDL быстро распространяются, поэтому сложные директивы, подобные тем, которые использует SPQR, вызывают проблемы ...

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