2

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

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

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

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

}

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

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

(我使用 graphql-java-tools 库)

4

2 回答 2

3

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

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

于 2018-04-01T18:01:00.100 回答
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
于 2019-04-11T18:36:01.457 回答