为了账号安全,请及时绑定邮箱和手机立即绑定

graphql-spqr 中的自定义标量类型

graphql-spqr 中的自定义标量类型

红糖糍粑 2022-12-15 15:27:08
在 graphql-spqr 中,将 java.util.Date 定义为 Scalar。是否可以覆盖 java.util.Date 的序列化/反序列化以获得日期的不同 String 表示形式?此答案中提到的 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;    }}GraphQL 响应:{  "data": {    "createOrder": {      "id": "74e4816c-f850-4d63-9855-e4601fa125f4",      "orderDate": "2019-05-26T08:25:01.349Z", // --> 2019-05-26    }  }}
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

ScalarStrategy不是实现您想要的目标的正确方法。当您想要更改 Java 类型映射到 GraphQL 的方式时,您通常会提供一个新的(或自定义一个现有的)TypeMapper.


查看现有的Date标量实现并以类似的方式实现您自己的标量实现。然后实现一个自定义,它总是简单地从和方法TypeMapper返回该标量的静态实例。toGraphQLTypetoGraphQLInputType


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在此处使用。您可以通过注册一个(它只不过是一个映射器 + 转换器)使 SPQR 透明地做到这一点,TypeAdapter但是如上所述的简单映射器是您的情况下更有效的解决方案。如果您仍然决定采用适配器方式,则可以继承AbstractTypeAdapter<Date, LocalDate>并实现转换逻辑(应该是微不足道的)。通过generator.withTypeAdapters或通过将其分别注册为映射器和转换器进行注册。


查看完整回答
反对 回复 2022-12-15
  • 1 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信