java - 如何在 GraphQL SPQR 中将子类视为其父类
问题描述
我围绕 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
}
解决方案
你可以做两件事。
将您的类映射为自定义标量。为此,您必须实现自定义
TypeMapper
并将其连接。或者,您可以提供
TypeAdapter
适应的自定义,BestDecimal
反之亦然BigDecimal
。
查看TypeMapper
or的现有实现TypeAdapter
,例如OptionalIntAdapter(使OptionalInt
充当Integer
),并在此基础上创建一个新实现。或查看此答案以获取自定义标量。
您可以使用generator.withTypeMappers
或连接它generator.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
不幸的是,您不能直接接线。您必须将它连接为TypeMapper
,InputConverter
同时OutputConverter
,这很烦人。所以相反,添加一个自定义模块会更容易TypeAdapter
:
@Bean
public ExtensionProvider<GeneratorConfiguration, Module> modules() {
return (config, modules) -> modules.append(context ->
context.getSchemaGenerator().withTypeAdapters(new YourCustomAdapter()));
}
您当然可以(并且应该)开设一个合适的Module
班级,而不是像我一样开设一个匿名班级。
推荐阅读
- c++ - 抽象类型可以用作纯虚函数的返回类型吗?
- kubernetes - 在线精品扩展
- angular - 花费大量时间来更新我的 firebase 项目的字段
- sql - 消息 3623,发生了无效的浮点运算
- c - 传递 char 和整数说明符时,scanf 会做什么?
- azure - Azure 流量管理器终结点更新失败,并显示“resourceTargetId 属性无效或缺失”
- docker - Gitlab CI,如何获取容器主机名,从docker-maven-plugin开始
- php - 有条件地将数组添加为另一个数组中的变量
- java - 由于内存不足错误,Springboot 测试上下文加载失败
- sql-server - 如何在“case when”中给出所有情况而不在查询中列出它们?