Пользовательский скалярный тип в 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 или зарегистрировав его как картограф и конвертер отдельно.

Другие вопросы по тегам