在 GraphQL 上获取原始字段名称
Get Original Field Name on GraphQL
我正在使用 https://github.com/leangen/graphql-spqr 和 spring-boot java 应用程序。我可以轻松访问别名,但如何访问原始字段名?
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”这样的原始名称。有办法吗?
已解决,根据:
在这里也张贴我的原始答案。
您需要基础字段名称,但来自更高级别。仍然有可能,但很难看:(
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 使用的复杂指令会导致问题...
我正在使用 https://github.com/leangen/graphql-spqr 和 spring-boot java 应用程序。我可以轻松访问别名,但如何访问原始字段名?
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”这样的原始名称。有办法吗?
已解决,根据:
在这里也张贴我的原始答案。
您需要基础字段名称,但来自更高级别。仍然有可能,但很难看:(
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 使用的复杂指令会导致问题...