graphql-java-tools:null参数vs not present参数

时间:2018-03-15 09:26:35

标签: java graphql

如果参数显式设置为null,或者根本没有提供参数,我如何区分java graphQL?

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

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

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

}

这里的想法是用户只提供他想要改变的字段(比如反应setState)。 因此,如果电子邮件被忽略,我想保持不变。

但是如果他/她想明确将电子邮件设置为null呢? 有没有办法通过我的解析器方法解决这个问题并采取相应行动?

(我使用graphql-java-tools库)

2 个答案:

答案 0 :(得分:0)

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

这提供了getArguments(),hasArgument()等方法。 使用这些方法,我们可以找出一个参数是否为null的显式设置,或者根本没有提供它。

答案 1 :(得分:0)

看起来像来自查询/变量的反序列化是由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