0

我在 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[America/Chicago]”

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

4

2 回答 2

0

我最终通过定义一个自定义 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;
    }
}
于 2019-10-15T15:28:50.113 回答
0

你不应该@GraphQLScalar在这里使用。该注释用于强制将复杂类型视为动态结构的标量。ZonedDateTimeSPQR 已经将其视为具有正确实施强制的标量,因此添加@GraphQLScalar会使其混乱。

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

于 2019-10-15T20:55:27.560 回答