添加自定义 Scalars

在 DGS 框架中添加自定义 scalar 类型很容易:创建一个实现 graphql.schema.Coercing 接口的类,并用 @DgsScalar 注释它。还要确保这个 scalar 类型也定义在 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

注册自定义 Scalars

graphql-java 的最新的版本(> v15.0)中,some scalars,特别是 Long scalar,默认是不可用的。这些是非标准 scalar,客户端(例如:JavaScript)很难可靠地处理它们。由于已弃用,您将需要显式地添加它们,为此您有几个选项。

Tip

全部的 scalars 支持列表,请参见 graphql-java-extended-scalars 项目页。在这里,您还将看到两种 schema 中使用的 scalars 的示例以及示例 query。

通过 graphql-dgs-extended-scalars 自动注册 Scalar 扩展

DGS 框架,从版本 3.9.2 开始,有 graphql-dgs-extended-scalars 模块。此模块提供 auto-configuration,它可以将定义在 com.graphql-java:graphql-java-extended-scalars 中的 scalar extension 自动注册。使用它你可以:

  1. 在你的 build 中添加 com.netflix.graphql.dgs:graphql-dgs-extended-scalars 依赖。如果你使用的是 DGS BOM,你不需要为它指定一个版本,BOM会推荐一个。

  2. 在你的 schema 定义 scalar

    extended scalars doc 上可用的其他映射

graphql-java-extended-scalars 模块提供了一些你可以关闭注册的把手。

属性

描述

dgs.graphql.extensions.scalars.time-dates.enabled

如果设置成 false, 将不会注册 DateTime, Date, 和 Time scalar extensions.

dgs.graphql.extensions.scalars.objects.enabled

如果设置成 false, 将不会注册 Object, Json, Url, 和 Locale scalar extensions.

dgs.graphql.extensions.scalars.numbers.enabled

如果设置成 false, 将不会注册所有的 numeric scalar extensions 比如 PositiveInt, NegativeInt, 等等.

dgs.graphql.extensions.scalars.chars.enabled

如果设置成false, 将不会注册 GraphQLChar extension.

dgs.graphql.extensions.scalars.enabled

如果设置成 false, 将关闭自动注册上面的所有类型.

重要

你是否正在使用 code generation Gradle Plugin

graphql-java-extended-scalar 模块不会修改此类插件的行为。您需要显式定义 type mappings。例如,假设我们想同时使用 UrlPositiveInt Scalars。您必须将下面的映射添加到构建文件中。

Gradle:

generateJava {
    typeMapping = [
        "Url" : "java.net.URL",
        "PositiveInt" : "java.lang.Integer"
    ]
}

Gradle Kotlin:

generateJava {
    typeMapping = mutableMapOf(
        "Url" to "java.net.URL",
        "PositiveInt" to "java.lang.Integer"
    )
}

通过 DgsRuntimeWiring 注册 Scalar Extensions

你也可以手动注册 Scalar Extensions。你需要:

  1. 在你的 build 中添加 com.graphql-java:graphql-java-extended-scalars 依赖。如果你使用的是 DGS BOM,你不需要为它指定一个版本,BOM会推荐一个。

  2. 在你的 schema 定义 scalar

  3. 注册 scalar

这是一个怎样注册的例子:

Schema:

scalar Long

你可以在 DGS 框架中手动注册 Long scalar:

@DgsComponent
public class LongScalarRegistration {
    @DgsRuntimeWiring
    public RuntimeWiring.Builder addScalar(RuntimeWiring.Builder builder) {
        return builder.scalar(Scalars.GraphQLLong);
    }
}

最后更新于

这有帮助吗?