我在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[美国/芝加哥]">
这是使用扩展标量的正确方法吗?
我最终通过定义一个自定义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;
}
}
你不应该在这里使用@GraphQLScalar
。该批注用于强制将复杂类型视为动态结构的标量。ZonedDateTime
已经被 SPQR 视为标量,并正确实现了强制,因此添加@GraphQLScalar
会搞砸它。
此外,您并不真正需要扩展标量库,除非您出于某种原因更喜欢该实现而不是 SPQR(我认为它们实际上是等效的(。在这种情况下,您使用自定义映射器的方法是正确的。