GraphQL SPQR Невозможно сериализовать ZonedDateTime, как ожидалось - PullRequest
0 голосов
/ 15 октября 2019

Я использую graphql-spqr-0.10.0 и использую подход, основанный на коде, и вот пример типа, который клиенты могут запрашивать.

@GraphQLType(name = "Activity", description = "Some activity")
public class SomeActivity {

  @GraphQLQuery(description = "Unique id")
  private @NotNull Long id = null;

  @GraphQLQuery(description = "Activity name")
  private @NotNull String name = null;

  @GraphQLScalar @GraphQLQuery(description = "Activity start date time")
  private @NotNull ZonedDateTime startTime = null;

  ...
}

У меня есть graphql-java-extended-scalars (версия 1.0) в classpath, и я прочитал в одном из потоков, что я могу пометить поле ZonedDateTime @GraphQLScalar для его сериализации с graphql.scalars.datetime.DateTimeScalar и создания формата даты ISO_OFFSET_DATE_TIME.

Вотфактический формат ответа, который я не верю, находится в желаемом формате ISO "startTime": "2017-12-29T16: 59: 57-06: 00 [Америка / Чикаго]"

Это правильный способ использованиярасширенные скаляры?

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Вы не должны использовать @GraphQLScalar здесь. Эта аннотация используется для принудительной обработки сложного типа как скаляра динамической структуры. ZonedDateTime уже рассматривается как скаляр SPQR с должным образом реализованным принуждением, поэтому добавление @GraphQLScalar портит его.

Кроме того, вам действительно не нужна расширенная библиотека скаляров, если вы по какой-то причине не предпочитаете эту реализациюнад SPQR (и я думаю, что они на самом деле эквивалентны). В этом случае ваш подход к использованию собственного картографа является правильным.

0 голосов
/ 15 октября 2019

Я решил эту проблему, определив собственный класс TypeMapper, как показано ниже. Хотя я понятия не имею, если это правильный способ решить эту проблему. Затем зарегистрировал новый экземпляр ZonedDateTimeTypeMapper с помощью GraphQLSchemaGenerator (). WithTypeMappers ()

public class ZonedDateTimeTypeMapper implements TypeMapper {

    private static final GraphQLScalarType type = new graphql.scalars.datetime.DateTimeScalar();

    @Override
    public boolean supports(AnnotatedType type) {
        return type.getType() == ZonedDateTime.class;
    }

    @Override
    public GraphQLInputType toGraphQLInputType(AnnotatedType javaType, OperationMapper operationMapper,
            Set<Class<? extends TypeMapper>> mappersToSkip, BuildContext buildContext) {
        return type;
    }

    @Override
    public GraphQLOutputType toGraphQLType(AnnotatedType javaType, OperationMapper operationMapper,
            Set<Class<? extends TypeMapper>> mappersToSkip, BuildContext buildContext) {
        return type;
    }
}
...