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 扩展标量不起作用:异常“无法构造实例”“无法反序列化”