Java GraphQL - 将字段值传递给对象的解析器

2024-01-30

我希望使用另一种对象类型将字段值传递给已解析的字段。

另一种说法是,如果我有“客户 > 用户 > 配置文件” - 如何将客户中的 CustomerID 字段值作为参数或变量传递给配置文件,以便正确解析?


有 5 种可能性(从 graphql-java v12 开始)向解析器提供信息(DataFetcher)在任何级别:

1)直接在查询中传递它们(可能在多个级别上):

{customer(id: 3) {
      user {
         profile(id: 3) {
             name
         }
      }
   }
}

2) 获取值source object

The source是封闭查询的结果。 就您而言,来源customerquery 是根(无论您在查询执行时提供什么,例如

graphQL.execute(ExecutionInput.newExecutionInput()
    .query(query)
    .root(root)
    .build())

的来源user查询是任意的customer返回查询,大概是一些Customer实例。
的来源profile查询是任何user返回的查询,大概是User实例。 您可以通过以下方式获取源代码DataFetchingEnvironment#getSource()。因此,如果User包含CustomerID你正在寻找,只需通过((User) env.getSource()).getCustomerId()。如果没有,请考虑将结果包装到一个对象中,该对象将包含子查询中所需的所有内容。

3)使用共享上下文传递值

graphql-java 传递一个实例GraphQLContext可供所有解析器使用。所以,里面DataFetcher for customer,您可以存储CustomerID进去:

Customer customer = getCustomer();
GraphQLContext context = env.getContext();
context.put("CustomerID", customer.getId());

后来,在里面DataFetcher for profile,你可以从上下文中得到它:

String customerId = env.getContext().get("CustomerID");

要初始化上下文,请在执行查询时传递它:

ExecutionInput input = ExecutionInput.newExecutionInput()
  .query(operation)
  .graphQLContext(new HashMap<>())
  .build()
graphQL.execute(query, input);

这种方式是有状态的,因此最难管理,因此只有在其他方法都失败时才使用它。

4) 直接获取传递给父字段的参数

ExecutionStepInfo stepInfo = dataFetchingEnvironment.getExecutionStepInfo();
stepInfo.getParent().getArguments(); // get the parent arguments

5)使用传递值local context

不是直接返回结果,而是将其包装成DataFetcherResult。这样您还可以将任何对象附加为localContext所有孩子都可以使用DataFetchers via DataFetchingEnvironment#getLocalContext()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java GraphQL - 将字段值传递给对象的解析器 的相关文章

随机推荐

  • CA2227 的解决方案还是更好的方法?

    我仅使用代码分析来清理 组织并确保针对特定警告的所有实例全局执行这些更改 我已经进入决赛了 比赛是 CA2227 CA2227 集合属性应为只读 将 更改为 通过删除属性设置器来只读 请注意 这是用于 EDI 文档的映射 这些类代表 EDI
  • 降落伞分段错误 - pygame 到 py2exe

    我正在使用 GUI2Exe 将我的 python pygame 游戏编译为 exe 我的字体模块有问题 使用 python 2 7 和 GUI2Exe 中的 py2exe 选项 我已经将 python pygame 和 py2exe 更新为
  • Chrome 的 colspan 和 border 错误?

    在下面的示例中 右侧单元格的顶部有一个边框 它只出现在 Chrome 中 是 Chrome 的 bug 吗 HTML CSS html body height 100 table border collapse collapse width
  • 在 Flutter 中重新发送 OTP 代码 Firebase 电话身份验证

    这可能是重复的 但任何其他线程都没有为我提供正确的答案 有关于 android 原生语言的答案 但没有关于 Flutter dart 的答案 我有以下有效方法 但如果我想将 OTP 重新发送到用户电话号码 我该怎么做 只需一个简单的示例代码
  • java jre 7u45 破坏了 classloader.getResources()?

    我有代码迭代 classLoader getResources META INF MANIFEST MF 的结果以返回类路径上的 jar 列表 从 1 6 0 18 一直到 1 7 0 40 这都工作得很好 现在 1 7 0 45 通过显示
  • EF Core Fluent API 配置防止 TPC 继承

    我有相互继承的模型 但我正在努力让流畅的 api 配置按照我想要的方式运行 假设我有一个基类 它定义了一些核心属性 public class Entity public int Id get set public string Title
  • 如何设置 Azure Devops 来构建 Devexpress XAF-XPO 项目?

    我想在 Azure Devops 中为 XAP 移动应用程序设置持续集成和部署 为了获得 CI CD 我需要设置 Azure Pipeline 来安装正确的包 文档中有一些信息托管您自己的 NuGet 源 https learn micro
  • 互换使用 std::string 和 QString

    我在我正在开发的图形和 GUI 组件软件系统中广泛使用 Qt 然而 对于大多数内部算法和数据处理来说 Qt 发挥的作用较小 我经常会遇到从 std string 转换为 QString 的需要 反之亦然 我的倾向是尽可能使用 std str
  • Git 元数据 - 有没有办法添加独立于每个分支的 git 元数据?

    最终目标 我想要由 Git 跟踪的文件 但让这些文件成为所有分支的版本相同 如果您 gitignore 文件 这些文件对于所有分支都是相同的 但不幸的是不会被跟踪 当我跑步时git push或类似的 我需要这些文件在存储库等之间传递 例如
  • RubyMine 按路径搜索文件项目

    在 SublimeText 2 中我可以这样做 cmd t 然后输入文件名或文件夹名称 然后显示结果 是与我正在搜索的术语匹配的文件与我正在搜索的术语的子文件夹中的文件相匹配的文件 例如 如果我的目录结构如下所示 models users
  • Python:如何不等待线程完成才能继续? [复制]

    这个问题在这里已经有答案了 所以我有一些代码等待 X 发生 然后创建一个线程并处理电子邮件 我正在寻找一种方法 让代码继续等待 X 即使 processEmail 正在另一个线程中发生 但目前代码只是等待线程完成 然后再等待 X 再次发生
  • Blazor Web Assembly 应用程序 .Net Core 托管:发布运行时错误

    我使用 NET 5 0 RC1 Framework 创建了一个托管在 NET Core 应用程序内的简单 Blazor Web Assembly 项目 并在 Visual Studio 2019 预览版中的向导过程中添加了授权 它在调试中完
  • 如何在 runAllManagedModulesForAllRequests 设置为 true 的情况下在 IIS 7 中禁用 flv 文件的 gzip 压缩?

    我有一个在 IIS 7 上运行的 ASP NET 3 5 网站 我希望将我的静态内容 如 css 文件 javascript 文件等 和动态内容 net 页面 进行 gzip 压缩 问题是我需要确保 flv 文件 Flash 视频文件 不是
  • 未安装指定平台工具集(v110)

    我有一个最初使用 VS2010 创建的解决方案 当我使用 VS 2012 打开它时 它要求我做一些转换 我同意了 现在我使用 VS 2010 再次打开解决方案 当我尝试构建它时出现错误 错误 MSB8008 指定的平台工具集 v110 未安
  • 与类相同类型的类变量

    在学习 Python 时 弄乱了典型的 Point 类示例 我注意到由于某种原因 我不能拥有与类相同类型的类级别 静态变量 例如 class Point ORIGIN Point doesn t work def init self x 0
  • 撤消“git Push”

    这是我在我的上所做的应该是稳定的分支 git rebase master First rewinding head to replay your work on top of it Fast forwarded alpha 0 3 0 to
  • unsigned long 和 unsigned long long 有什么区别?

    我预计尺寸会有所不同 但两者都显示 8 字节 include
  • 在类本身中分配变量还是在类的构造函数中分配变量更好? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这是一种设计问题 我确信有人同时采用这两种方法 但您认为 在类中分配变量还是在构造函数中分配变量更好 例如 无论语法或语言如何 这只是为了解释
  • OpenCV GrabCut 算法示例不起作用

    我正在尝试使用 C 在 OpenCV 中实现抓取算法 我偶然发现这个网站 http www packtpub com article opencv segmenting images并找到了一种非常简单的方法 不幸的是 该代码似乎不适合我
  • Java GraphQL - 将字段值传递给对象的解析器

    我希望使用另一种对象类型将字段值传递给已解析的字段 另一种说法是 如果我有 客户 gt 用户 gt 配置文件 如何将客户中的 CustomerID 字段值作为参数或变量传递给配置文件 以便正确解析 有 5 种可能性 从 graphql ja