Spring Boot 2 / GraphQL 扩展标量不起作用:异常“无法构造实例”“无法反序列化”

Dr.*_*ste 2 spring-boot graphql

我有一个 GraphQL API(Spring Boot 2、GraphQL Spring Boot Starter、GraphiQL)的工作设置。

然后我尝试引入由库graphql-java-extended-scalars提供的自定义标(在本例中为java.time.LocalDate类型的成员的DateScalar):

我在模式中声明了自定义标量和类型,

scalar Date
...
  somedate: Date
...
Run Code Online (Sandbox Code Playgroud)

GraphQLScalarType作为 Spring Bean 提供(否则服务器不会启动):

scalar Date
...
  somedate: Date
...
Run Code Online (Sandbox Code Playgroud)

我用Date执行了一个突变查询。

@Bean
public GraphQLScalarType date() {
   return ExtendedScalars.Date;
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是我得到了这个例外,

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDate` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
Run Code Online (Sandbox Code Playgroud)

经过几个小时的研究,我不知道哪里出了问题。尽管在配置中提供了标量,但似乎没有选择标量。

GraphQLInputType这样,

mutation {
  createSomething(
    something:{
      ...
      somedate: "2018-07-20",
      ...
    }
  )
}
Run Code Online (Sandbox Code Playgroud)

小智 5

我认为在为 SchemaParserOptions 提供调整后的映射器配置后,它可以工作:

@Bean
public SchemaParserOptions schemaParserOptions(){
   return SchemaParserOptions.newOptions().objectMapperConfigurer((mapper, context) -> {
        mapper.registerModule(new JavaTimeModule());
    }).build();
}
Run Code Online (Sandbox Code Playgroud)

GraphQL 使用自己的对象映射器,因此您必须在其上注册 JavaTimeModule。