【问题标题】:Custom Scalar in Graphql-javaGraphql-java 中的自定义标量
【发布时间】:2018-02-12 13:24:53
【问题描述】:

我们计划在我们的应用程序中使用 Graphql 作为后端服务器。我们选择 Graphql-Java 来开发我们的 POC。我们遇到了创建自己的标量类型来处理 java.util.Map 对象类型的情况。

我们还没有找到任何有关创建自定义标量类型的文档。 在下面的示例代码中

RuntimeWiring buildRuntimeWiring() {
    return RuntimeWiring.newRuntimeWiring()
            .scalar(CustomScalar)

如何为 CustomScalar 对象完成实现。 需要帮助。

【问题讨论】:

    标签: java graphql graphql-java


    【解决方案1】:

    要大致了解如何制作标量,只需查看the existing ones 并执行类似操作。

    graphql-java 还有一个用于额外标量的单独项目:graphql-java-extended-scalars。在那里你可以找到object scalar (a.k.a. JSON scalar),它可以用于动态结构,比如Maps。

    通过以下方式注册:

    RuntimeWiring.newRuntimeWiring().scalar(ExtendedScalars.Object)
    

    【讨论】:

    • 如何在我的代码中使用上述缩放器?我有一个 Spring-boot 应用程序,如果你能提供一个例子,它会有所帮助。
    • @Simple-Solution 您如何使用任何内置标量,如字符串或整数?没有区别。
    • 不确定我理解你的意思。但是那些; String 和 Integer 是内置的,这一切都是自动发生的。所以上面的标量是对象,我需要为 Map 创建一个,对吗?你有例子吗。 name 参数的意义何在?那是我们在模式中定义的类型的名称吗?
    • @Simple-Solution 自动发生?这是否意味着您正在使用 GraphQL-SPQR?如果是这样,请使用@GraphQLScalar 注释使用位置的类型(例如,注释方法参数)或使用不同的ScalarMappingStrategy(例如gen.withScalarMappingStrategy(new MapScalarStrategy()))。没有 SPQR,就没有自动映射。您设置每个字段的类型,例如newFieldDefinition().type(Scalars.GraphQLString),所以你可以改用newFieldDefinition().type(Scalars.graphQLObjectScalar("typeName"))。你会得到一个Map,就像任何对象输入一样,但具有动态结构。
    • @Simple-Solution 如果直接使用 schema-first 和 graphql-java,您可以通过 RuntimeWiring.newRuntimeWiring().scalar(Scalars.graphQLObjectScalar("typeN‌​ame")) 使用自定义标量。请注意,在第二个和第三个示例中,Scalars 是 io.leangen.graphql.util.Scalars 而不是 graphql.Scalars。或者只是将 SPQR 码复制到您自己的课程中。
    【解决方案2】:

    在代码优先方法 (SPQR v0.9.6) 中添加 @GraphQLScalar 就足够了。 或者,作为替代方案,将标量定义添加到 GraphQLSchemaGenerator:

    new GraphQLSchemaGenerator()
    .withScalarMappingStrategy(new MyScalarStrategy())
    

    并定义 MyScalarStrategy:

    class MyScalarStrategy extends DefaultScalarStrategy {
    
    @Override
    public boolean supports(AnnotatedType type) {
      return super.supports(type) || GenericTypeReflector.isSuperType(MyScalarStrategy.class, type.getType());
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 2018-05-29
      • 2020-08-03
      • 2018-12-04
      • 2020-10-21
      • 2019-10-12
      • 2022-08-05
      • 2018-10-24
      • 2020-10-31
      相关资源
      最近更新 更多