Получить исходное имя поля на 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». Как это сделать?
Решено, согласно:
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, вызывают проблемы ...