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
相关文章
DataFrame(12):数据转换——apply(),applymap()函数的使用(一)
DataFrame(12):数据转换——apply(),applymap()函数的使用(一)
DataFrame(12):数据转换——apply(),applymap()函数的使用(一)
|
1月前
|
数据采集 前端开发 数据处理
Scrapy的Lambda函数用法:简化数据提取与处理的技巧
在现代爬虫开发中,**Scrapy** 是一个广泛使用的高效 Python 框架,适用于大规模数据爬取。本文探讨如何利用 Python 的 **Lambda 函数** 简化 Scrapy 中的数据提取与处理,特别是在微博数据爬取中的应用。通过结合 **代理IP**、**Cookie** 和 **User-Agent** 设置,展示了实际用法,包括代码示例和优化技巧,以提高爬虫的稳定性和效率。使用 Lambda 函数能显著减少代码冗余,提升可读性,有效应对复杂的数据清洗任务。
|
1月前
|
TensorFlow 算法框架/工具
Tensorflow学习笔记(二):各种tf类型的函数用法集合
这篇文章总结了TensorFlow中各种函数的用法,包括创建张量、设备管理、数据类型转换、随机数生成等基础知识。
35 0
|
4月前
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
6月前
|
存储 网络架构
ES6之rest参数、扩展运算符
ES6之rest参数、扩展运算符
40 1
|
6月前
|
JavaScript
函数形状有几种定义方式;操作符infer的作用
函数形状有几种定义方式;操作符infer的作用
46 3
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
pytorch中非标量调用backward()的时候为什么要先进行sum操作
在《动手学深度学习》第二版教程中,当y为非标量的时候,调用backward()函数时,为什么先要求和呢(即y.sum().backward()),估计很多读者有点懵,今天小编给大家说说我的理解。
394 3
|
JavaScript 前端开发 网络架构
【ES6】函数的参数、Symbol数据类型、迭代器与生成器
【ES6】函数的参数、Symbol数据类型、迭代器与生成器
106 0
|
网络架构
es6 箭头函数 rest参数 扩展运算符
es6 箭头函数 rest参数 扩展运算符
|
存储 计算机视觉
OpenCV:Scalar数据类型理解
OpenCV:Scalar数据类型理解
677 0
OpenCV:Scalar数据类型理解