graphql-java-tools:空参数与不存在参数

Posted

技术标签:

【中文标题】graphql-java-tools:空参数与不存在参数【英文标题】:graphql-java-tools: null parameter vs not present parameter 【发布时间】:2018-08-24 00:55:51 【问题描述】:

如何在 java graphQL 中区分参数是显式设置为 null,还是根本没有提供?

我尝试实现的用例如下:我有一个像这样的突变

updateUser(id:Int!, changes:UserChanges!)

#where UserChanges is defined as:
type UserChanges 
    login:String
    email:String
    #etc

这里的想法是用户只提供他想要更改的字段(例如 react setState)。 因此,如果省略了电子邮件,我想保持不变。

但是如果他/她想明确地将 email 设置为 null 怎么办? 有没有办法从我的解析器方法中解决这个问题并采取相应的行动?

(我使用 graphql-java-tools 库)

【问题讨论】:

【参考方案1】:

我找到了答案。如果有人需要它: 每个解析器方法都可以使用 graphql.schema.DataFetchingEnvironment 的实例。

这提供了 getArguments()、hasArgument() 等方法。 使用这些方法,我们可以查明参数是显式设置为 null,还是根本没有提供。

【讨论】:

【参考方案2】:

看起来查询/变量的反序列化是由 fastxml Jackson 处理的,这是处理问题的合适地方,否则它会变得太复杂:检查每个字段?嵌套?

所以:UserChanges.java 应该如下所示:

class UserChanges 
// SHOULD NOT HAVE ALL ARGUMENT CONSTRUCTOR!
 Optional<String> login;
 Optional<String> email;
 ... getters & setters

在这种情况下,反序列化器将使用设置器,仅用于提供的字段! 而"login":null 将变为:

UserChanges.login = Optional.empty
UserChanges.email = null

【讨论】:

以上是关于graphql-java-tools:空参数与不存在参数的主要内容,如果未能解决你的问题,请参考以下文章

graphql servlet 未使用 graphql-java-tools 启动(未找到模式文件?)

使用 graphql-java-tools 和 graphql-spring-boot-starter 处理错误

在 graphql-java-tools 中禁用 GraphQL Introspection

使用graphql-java-tools和graphql-spring-boot-starter处理错误。

如何在 graphql-java-tools Resolver 中 @Autowire 一个 JPA 存储库

传递 NULL 参数与不传递参数完全相同