【问题标题】:graphql-java-tools: null parameter vs not present parametergraphql-java-tools:空参数与不存在参数
【发布时间】: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 库)

【问题讨论】:

    标签: java graphql 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
      

      【讨论】:

        猜你喜欢
        • 2019-03-22
        • 1970-01-01
        • 2021-05-13
        • 2021-03-01
        • 2018-01-10
        • 1970-01-01
        • 2015-03-08
        • 2021-12-05
        • 2019-05-09
        相关资源
        最近更新 更多