我正在使用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 [美国/芝加哥]”
这是使用扩展标量的正确方法吗?
答案 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的实现(并且我认为它们实际上是等效的),否则您实际上并不需要扩展的标量库。在这种情况下,您使用自定义映射器的方法是正确的。