【问题标题】:Custom Scalar Type in graphql-spqrgraphql-spqr 中的自定义标量类型
【发布时间】:2019-10-12 04:21:18
【问题描述】:

我在graphql-spqr中,java.util.Date被定义为Scalar。是否可以覆盖 java.util.Date 的序列化/反序列化以获得日期的不同 String 表示形式?

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;
    }
}

GraphQL 响应:

{
  "data": {
    "createOrder": {
      "id": "74e4816c-f850-4d63-9855-e4601fa125f4",
      "orderDate": "2019-05-26T08:25:01.349Z", // --> 2019-05-26
    }
  }
}

【问题讨论】:

  • 在我的答案中添加了一个代码示例。不完美,但我可以在手机上做到最好。

标签: java graphql graphql-spqr


【解决方案1】:

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。您可以通过注册TypeAdapter(只不过是一个映射器+转换器)使 SPQR 透明地执行此操作,但是如上所述的简单映射器在您的情况下是一种更有效的解决方案。如果还是决定走适配器方式,可以继承AbstractTypeAdapter<Date, LocalDate>,实现转换逻辑(应该很简单)。通过generator.withTypeAdapters 注册或分别注册为映射器和转换器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 2019-10-19
    • 2018-05-29
    • 2018-02-12
    • 2020-08-03
    • 2018-10-24
    • 2020-03-22
    • 2019-12-24
    相关资源
    最近更新 更多