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

Posted

技术标签:

【中文标题】Spring Boot 2 / GraphQL 扩展标量不起作用:异常“无法构造实例”“无法反序列化”【英文标题】:Spring Boot 2 / GraphQL Extended Scalars not working: Exception "Cannot construct instance" "cannot deserialize" 【发布时间】:2019-11-25 23:28:39 【问题描述】:

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

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

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

scalar Date
...
  somedate: Date
...

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

@Bean
public GraphQLScalarType date() 
   return ExtendedScalars.Date;

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

mutation 
  createSomething(
    something:
      ...
      somedate: "2018-07-20",
      ...
    
  )

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

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)

经过几个小时的研究,我不知道可能出了什么问题。尽管配置中提供了标量,但似乎没有拾取。

GraphQLInputType 看起来像这样,

@Data
public class Something implements GraphQLInputType 

    ...
    private LocalDate somedate;
    ...

    @Override
    public String getName() 
        return "Something";
    

【问题讨论】:

【参考方案1】:

问题是您要反序列化对象的类没有公共默认构造函数。

【讨论】:

谢谢。我检查了这个,但是该类有一个公共的无参数构造函数(通过 Lombok 注释 @Data)。(异常消息说:无法构造 java.time.LocalDate 的实例 你也可以提供你的课程吗? 我添加了一个类似于类的示例。 你有公共二传手吗? Jackson 应该可以通过 public args 构造函数或 public no args 构造函数和 public setter 访问您的类属性。 public no args 构造函数和setter/getter 由lombok @Data 生成。但我什至没有尝试过没有龙目岛,这无论如何都不应该有所作为。所以是的,所有这些方法都在那里。【参考方案2】:

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

@Bean
public SchemaParserOptions schemaParserOptions()
   return SchemaParserOptions.newOptions().objectMapperConfigurer((mapper, context) -> 
        mapper.registerModule(new JavaTimeModule());
    ).build();

GraphQL 使用自己的 objectmapper,因此您必须在其上注册 JavaTimeModule。

【讨论】:

作品 - 太好了 - 谢谢!现在我在这里找到了更多相关信息:github.com/graphql-java-kickstart/graphql-spring-boot/issues/32

以上是关于Spring Boot 2 / GraphQL 扩展标量不起作用:异常“无法构造实例”“无法反序列化”的主要内容,如果未能解决你的问题,请参考以下文章

graphql-spring-boot-starter 只有 websockets 的应用程序

如何使用 graphql-spring-boot 向 GraphQL Java 添加检测?

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

使用 graphql-java-tools 和 graphql-spring-boot-starter 处理错误

GraphQL Spring-boot 查询过滤

graphql-spring-boot 上传二进制文件