graphql-java-tools:空参数与不存在参数
graphql-java-tools: null parameter vs not present parameter
我如何在 java graphQL 中区分参数是否明确设置为 null,或者根本没有提供?
我尝试实现的用例如下:我有一个像这样的突变
updateUser(id:Int!, changes:UserChanges!)
#where UserChanges is defined as:
type UserChanges {
login:String
email:String
#etc
}
这里的想法是用户只提供他想要更改的字段(例如 react setState)。
所以如果省略了电子邮件,我想保持不变。
但是,如果 he/she 想要将电子邮件显式设置为 null 怎么办?
有什么办法可以从我的解析器方法中弄清楚这一点并采取相应的行动吗?
(我使用 graphql-java-tools 库)
我找到了答案。如果有人需要它:
graphql.schema.DataFetchingEnvironment 的实例可用于每个解析器方法。
这提供了 getArguments()、hasArgument() 等方法。
使用这些方法,我们可以查明参数是否显式设置为 null,或者根本没有提供。
看起来 query/variables 的反序列化是由 fasterxml 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
我如何在 java graphQL 中区分参数是否明确设置为 null,或者根本没有提供?
我尝试实现的用例如下:我有一个像这样的突变
updateUser(id:Int!, changes:UserChanges!)
#where UserChanges is defined as:
type UserChanges {
login:String
email:String
#etc
}
这里的想法是用户只提供他想要更改的字段(例如 react setState)。 所以如果省略了电子邮件,我想保持不变。
但是,如果 he/she 想要将电子邮件显式设置为 null 怎么办? 有什么办法可以从我的解析器方法中弄清楚这一点并采取相应的行动吗?
(我使用 graphql-java-tools 库)
我找到了答案。如果有人需要它: graphql.schema.DataFetchingEnvironment 的实例可用于每个解析器方法。
这提供了 getArguments()、hasArgument() 等方法。 使用这些方法,我们可以查明参数是否显式设置为 null,或者根本没有提供。
看起来 query/variables 的反序列化是由 fasterxml 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