GraphQL SPQR无法按预期序列化ZonedDateTime

时间:2019-10-14 21:08:38

标签: graphql-java graphql-spqr

我正在使用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版),并且读取了可以用@GraphQLScalar标记ZonedDateTime字段的一个线程,以便使用graphql.scalars.datetime.DateTimeScalar进行序列化并产生ISO_OFFSET_DATE_TIME日期格式。

这是我不相信采用所需ISO格式“ startTime”的实际响应格式:“ 2017-12-29T16:59:57-06:00 [美国/芝加哥]”

这是使用扩展标量的正确方法吗?

2 个答案:

答案 0 :(得分:0)

我最终通过定义如下的Custom TypeMapper类解决了这个问题。虽然我不知道这是否是解决此问题的正确方法。然后向GraphQLSchemaGenerator()。withTypeMappers()

注册一个新的ZonedDateTimeTypeMapper实例。
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;
    }
}

答案 1 :(得分:0)

您不应在此处使用People。该注释用于强制将复杂类型视为动态结构的标量。 Clipboard已被SPQR视为标量,并具有适当实施的强制性,因此添加@GraphQLScalar会使它混乱。

此外,除非您出于某种原因而不是SPQR的实现(并且我认为它们实际上是等效的),否则您实际上并不需要扩展的标量库。在这种情况下,您使用自定义映射器的方法是正确的。