【问题标题】:How to treat a child class like its parent in GraphQL SPQR如何在 GraphQL SPQR 中将子类视为其父类
【发布时间】:2021-10-29 15:19:48
【问题描述】:

我围绕 BigDecimal 创建了一个包装器。基本上只是在上面放了一堆更友好的方法。我将它用于我的一些 POJO 字段,它会生成这样的模式

# Built-in java.math.BigDecimal
scalar BigDecimal

input BestDecimalInput {
  scale: Int!
}

理想情况下,当我进行查询时,我可以将其视为 BigDecimal。我有一个构造函数

public BestDecimal(double val) {
        super(val);
    }

我希望它可以让我在查询/突变中使用常规浮点数,但它似乎并没有那样工作。基本上,如果下面是 BestDecimal 对象,我希望它像 BigDecimal 一样工作。

myquery(number: 10){
  whatever
}

【问题讨论】:

    标签: java graphql graphql-spqr graphql-spqr-spring-boot-starter


    【解决方案1】:

    你可以做两件事。

    • 将您的类映射为自定义标量。为此,您必须实现自定义 TypeMapper 并将其连接。

    • 或者,您可以提供自定义TypeAdapter,将BestDecimal 适配为BigDecimal,反之亦然。

    查看TypeMapperTypeAdapter 的现有实现,例如OptionalIntAdapter(这使得OptionalInt 充当Integer),并在此基础上创建一个新的。或者查看 this answer 获取自定义标量。

    您可以使用generator.withTypeMappersgenerator.withTypeAdapters连接它。

    使用 Spring Starter,您可以像这样添加TypeMapper

    @Bean
    public ExtensionProvider<GeneratorConfiguration, TypeMapper> mappers() {
        //After IdAdapter is generally a safe place to insert custom mappers
        return (config, mappers) -> mappers.insertAfter(IdAdapter.class, new YouCustomMapper());
    }
    

    很遗憾,您不能直接连接TypeAdapter。您必须同时将其连接为TypeMapperInputConverterOutputConverter,这很烦人。因此,添加一个添加 TypeAdapter 的自定义模块会更容易:

    @Bean
    public ExtensionProvider<GeneratorConfiguration, Module> modules() {
        return (config, modules) -> modules.append(context -> 
             context.getSchemaGenerator().withTypeAdapters(new YourCustomAdapter()));
    }
    

    您当然可以(并且应该)创建一个适当的 Module 类,而不是像我一样创建一个匿名类。

    【讨论】:

      猜你喜欢
      • 2020-02-28
      • 2018-12-05
      • 2019-10-12
      • 2021-10-26
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      相关资源
      最近更新 更多