Custom Scalar Type in graphql-spqr(GraphQL-SPQR中的自定义标量类型)
问题描述
I GraphQL-SPQR,java.util.Date定义为Scalar。是否可以覆盖java.util.Date的序列化/反序列化以获得日期的不同字符串表示形式?
此answer中提到的ScalarStrategy已从最新版本中删除。
public class Order {
private String id;
private Date orderDate; //GraphQLScalarType "Date"
public Order() {
}
public Order(String id, String bookId, Date orderDate) {
this.id = id;
this.orderDate = orderDate;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Date getOrderDate() {
return orderDate;
}
public void setOrderDate(Date orderDate) {
this.orderDate = orderDate;
}
}
图形QL响应:
{
"data": {
"createOrder": {
"id": "74e4816c-f850-4d63-9855-e4601fa125f4",
"orderDate": "2019-05-26T08:25:01.349Z", // --> 2019-05-26
}
}
}
推荐答案
ScalarStrategy
不是实现您想要的目标的正确方式。当您要更改Java类型映射到GraphQL的方式时,通常需要提供新的(或自定义现有的)TypeMapper
。
Date
标量实现,并以类似的方式实现您自己的。然后实现一个自定义TypeMapper
,它只是始终从toGraphQLType
和toGraphQLInputType
方法返回该标量的静电实例。
public class CustomTypeMapper implements TypeMapper {
private static final GraphQLScalarType GraphQLCustomDate = ...;
@Override
public GraphQLOutputType toGraphQLType(...) {
return GraphQLCustomDate;
}
@Override
public GraphQLInputType toGraphQLInputType(...) {
return GraphQLCustomDate;
}
@Override
public boolean supports(AnnotatedType type) {
return type.getType() == Date.class; // This mapper only deals with Date
}
}
若要注册它,请调用generator.withTypeMappers(new CustomTypeMapper()
。
也就是说,因为您只想切断时间部分,所以理想情况下在这里使用LocalDate
。您可以通过注册TypeAdapter
(它只是一个映射器+转换器)来透明地让SPQR实现这一点,但是在您的情况下,如上所述的简单映射器是一个更有效的解决方案。如果您仍然决定采用适配器的方式,您可以继承AbstractTypeAdapter<Date, LocalDate>
并实现转换逻辑(应该很简单)。通过generator.withTypeAdapters
注册,或将其分别注册为映射器和转换器。
这篇关于GraphQL-SPQR中的自定义标量类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:GraphQL-SPQR中的自定义标量类型
基础教程推荐
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01