GraphQL(四)自定义标量[Scalar]详解

简介: 本文介绍GraphQL的标量拓展、自定义标量的定义及使用。从版本 3.9.2 开始,DGS 框架具有graphql-dgs-extended-scalars模块。此模块提供自动配置,将自动注册库中定义的标量扩展 `com.graphql-java:graphql-java-extended-scalars`。

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

使用标量拓展的步骤:

  1. 使用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>
  1. Schema配置标量
scalar Date
  1. 启动注册
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 的标量

更多拓展标量,如URLJSON等可见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

详细例子可见Writing your own Custom Scalars


参考资料:

  1. GraphQL(一)基础介绍及应用示例
  2. Adding Custom Scalars
  3. graphql-dgs-extended-scalars
相关文章
|
8月前
|
存储 JSON 前端开发
JSON数组的概念、语法和用法
JSON数组的概念、语法和用法
1297 3
|
23小时前
|
SQL 算法 Java
从集合运算设计 Lambda 语法
集合化程序语言通过简洁的语句实现复杂集合运算,Lambda语法的设计至关重要。首先,直接使用集合成员进行简单运算如求和,无需Lambda。接着,引入Lambda表达式处理更复杂的运算,如计算平方和。SPL使用“~”表示当前成员,简化表达,而SQL则依赖字段引用机制,牺牲了对泛型成员的支持。在嵌套引用时,采用就近原则避免歧义。SPL拓展了SQL的数据组织,支持任意成员的集合,使Lambda语法更加灵活。
|
3月前
|
数据采集 前端开发 数据处理
Scrapy的Lambda函数用法:简化数据提取与处理的技巧
在现代爬虫开发中,**Scrapy** 是一个广泛使用的高效 Python 框架,适用于大规模数据爬取。本文探讨如何利用 Python 的 **Lambda 函数** 简化 Scrapy 中的数据提取与处理,特别是在微博数据爬取中的应用。通过结合 **代理IP**、**Cookie** 和 **User-Agent** 设置,展示了实际用法,包括代码示例和优化技巧,以提高爬虫的稳定性和效率。使用 Lambda 函数能显著减少代码冗余,提升可读性,有效应对复杂的数据清洗任务。
|
6月前
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
8月前
|
JavaScript
函数形状有几种定义方式;操作符infer的作用
函数形状有几种定义方式;操作符infer的作用
53 3
|
存储 算法 编译器
【C++】lambda 表达式 | 包装器
【C++】lambda 表达式 | 包装器
【C++】lambda 表达式 | 包装器
|
JavaScript
Swift中关于集合计算的几种函数记录(intersect、symmetricDifference、union、subtract)
Swift中关于集合计算的几种函数记录(intersect、symmetricDifference、union、subtract) 很久之前用过一次,后来就忘了。。。扎心,现在记录一下 PS:这几种函数其实不限于swift内的,在JavaScript、python、DB等其他语言,应该也有类似用法,这里我只简单讲了在swift内的用法。
1736 0
|
C# 网络架构 数据库
C#语法——元组类型
元组Tuple     我们现在使用的C#语法已经可以满足日常的开发需求,但C#语法还在进行版本的更新,在创造更多更优秀的语义来让我们使用。这里介绍一下C#5.0里的提供的语法——元组。   在C#中定义Tuple对象,转到定义查看,我们会看到如下代码 #region 程序集 mscorlib, Version=4.
1351 0
|
测试技术 Shell
[20180625]函数与标量子查询13(补充)
[20180625]函数与标量子查询13(补充).txt --//最近一段时间一直在测试标量子查询视buckets的数量,我前面的测试方法纯粹蛮力测试. --//参考链接:http://blog.
1337 0
|
Java 编译器
2、Lambda 语法格式
1、语法定义。 (参数)->{函数体} 函数的参数 函数-> 函数体 只有一个参数时,括号可以省略 函数体只有一个语句时,括号可以省略 如果用面向对象的思维来看Lambda,可以包Lambda的一个高度的抽象。
953 0

热门文章

最新文章