在 GraphQL 上获取原始字段名称
Posted
技术标签:
【中文标题】在 GraphQL 上获取原始字段名称【英文标题】:Get Original Field Name on GraphQL 【发布时间】:2021-05-27 20:45:22 【问题描述】:我将 https://github.com/leangen/graphql-spqr 与 spring-boot 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);
随着基于 SDL 的工具的激增,该 API 将来可能需要更改,因此像 SPQR 使用的复杂指令会导致问题...
【讨论】:
以上是关于在 GraphQL 上获取原始字段名称的主要内容,如果未能解决你的问题,请参考以下文章
如何在graphql中获取响应中的所有字段而不在查询中传递任何字段名称