Пользовательский скалярный тип в graphql-spqr
Я graphql-spqr, java.util.Date определяется как Скалярный. Можно ли перезаписать сериализацию / десериализацию java.util.Date, чтобы получить другое строковое представление даты?
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
}
}
}
0 ответов
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
Вот. Вы можете заставить SPQR сделать это прозрачно, зарегистрировав TypeAdapter
(это не что иное, как преобразователь mapper +), но простой преобразователь, как описано выше, является более эффективным решением в вашем случае. Если вы все же решили пойти по пути адаптера, вы можете наследовать AbstractTypeAdapter<Date, LocalDate>
и реализовать логику преобразования (должно быть тривиальным). Зарегистрируйтесь через generator.withTypeAdapters
или зарегистрировав его как картограф и конвертер отдельно.