GraphQL默认标量类型
Int
:有符号 32 位整数。Float
:有符号双精度浮点值。String
:UTF‐8 字符序列。Boolean
:true 或者 false。ID
:ID 标量类型表示一个唯一标识符
GraphQL默认标量类型详见对象类型和字段
除了以上GraphQL 规范定义的内置标量,使用其他类型如Long/BigDecimal/Date等,需要自定标量
标量拓展
从版本 3.9.2 开始,DGS 框架具有graphql-dgs-extended-scalars模块。此模块提供自动配置,将自动注册库中定义的标量扩展 com.graphql-java:graphql-java-extended-scalars
使用标量拓展的步骤:
- 使用maven/gradle添加
com.netflix.graphql.dgs:graphql-dgs-extended-scalars
依赖
<dependency>
<groupId>com.netflix.graphql.dgs</groupId>
<artifactId>graphql-dgs-extended-scalars</artifactId>
<version>${dgs.version}</version>
</dependency>
Schema
配置标量
scalar Date
- 启动注册
dgs:
graphql:
extensions:
scalars:
time-dates:
enabled: true
拓展标量开关
graphql-java-extended-scalars
模块提供了一些可用于关闭注册的开关
参数 | 描述 |
---|---|
dgs.graphql.extensions.scalars.time-dates.enabled | 如果设置为false ,它将不会注册 DateTime、Date 和 Time 标量扩展 |
dgs.graphql.extensions.scalars.objects.enabled | 如果设置为false ,它将不会注册 Object、Json、Url 和 Locale 标量扩展 |
dgs.graphql.extensions.scalars.numbers.enabled | 如果设置为false ,则不会注册所有数字标量扩展,例如 PositiveInt、NegativeInt 等 |
dgs.graphql.extensions.scalars.chars.enabled | 如果设置为false ,则不会注册 GraphQLChar 扩展 |
dgs.graphql.extensions.scalars.enabled | 如果设置为false ,它将禁用上述所有内容的自动注册 |
拓展标量
graphql-java-extended-scalars
添加了以下在基于 Java 的系统中很有用的标量类型:
- Long aka
GraphQLLong
- 基于 java.lang.Long 的标量 - Short aka
GraphQLShort
- 基于 java.lang.Short 的标量 - Byte aka
GraphQLByte
- 基于 java.lang.Byte 的标量 - BigDecimal aka
GraphQLBigDecimal
- 基于 java.math.BigDecimal 的标量 - BigInteger aka
GraphQLBigInteger
- 基于 java.math.BigInteger 的标量
更多拓展标量,如
URL
、JSON
等可见graphql-java
自定义标量
任何自定义标量需要实现graphql.schema.Coercing
接口。包括以下 3 个功能:
parseValue
:将查询变量中的输入解析为可接受标量类型的 Java 对象parseLiteral
:在查询验证期间被调用,将查询输入 AST 节点转换为可接受标量类型的 Java 对象。输入对象将是graphql.language.Value
的实例serialize
:将 DataFetcher 返回的 Java 对象转换为标量类型的有效运行时对象
自定义标量实例
创建一个实现graphql.schema.Coercing
接口的类并用@DgsScalar
注解对其进行注解。还要确保在 GraphQL schema 中定义了标量类型
一个简单的LocalDateTime
实现
@DgsScalar(name="DateTime")
public class DateTimeScalar implements Coercing<LocalDateTime, String> {
@Override
public String serialize(Object dataFetcherResult) throws CoercingSerializeException {
if (dataFetcherResult instanceof LocalDateTime) {
return ((LocalDateTime) dataFetcherResult).format(DateTimeFormatter.ISO_DATE_TIME);
} else {
throw new CoercingSerializeException("Not a valid DateTime");
}
}
@Override
public LocalDateTime parseValue(Object input) throws CoercingParseValueException {
return LocalDateTime.parse(input.toString(), DateTimeFormatter.ISO_DATE_TIME);
}
@Override
public LocalDateTime parseLiteral(Object input) throws CoercingParseLiteralException {
if (input instanceof StringValue) {
return LocalDateTime.parse(((StringValue) input).getValue(), DateTimeFormatter.ISO_DATE_TIME);
}
throw new CoercingParseLiteralException("Value is not a valid ISO date time");
}
}
Schema
scalar DateTime
参考资料: