微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取 GraphQL 上的原始字段名称

如何解决获取 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”这样的原始名称。有办法吗?

解决,根据:

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

解决方法

也在这里发布我的原始答案。

您需要底层字段名称,但来自上一层。仍然有可能,但丑陋:(

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#getPropertyMembersClassUtils.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 使用的那些复杂指令会导致问题...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。