gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:37:28 25 4
gpt4 key购买 nike

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

本文中提到的ScalarStrategy answer已在最新版本中删除。

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

最佳答案

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或者将其分别注册为映射器和转换器。

关于java - graphql-spqr 中的自定义标量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56311700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com