当前位置: 首页 > 知识库问答 >
问题:

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

陶福
2023-03-14

我已经为graphqlapi(springboot2、graphqlsspringbootstarter、GraphiQL)建立了一个工作设置。

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

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

scalar Date
...
  somedate: Date
...

我提供了GraphQLScalarType作为Springbean(否则服务器无法启动):

@Bean
public GraphQLScalarType date() {
   return ExtendedScalars.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";
    }
}

共有2个答案

东方和惬
2023-03-14

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

翟奇
2023-03-14

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

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

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

 类似资料:
  • 我有一个以下类: 当我尝试转换JSON时 对于这个类实例,我得到以下异常: 获取原因:com . faster XML . Jackson . databind . jsonmappingexception:无法构造com . medianet . rtb . mogli . commons . dto . ad exchange . floor price data的实例:没有字符串参数构造函数

  • 当然,所有依赖项(子类追加在同一个字符串中)。 从外部API获取数据的代码是; 当我运行代码并试图获取adress“API/3”时,出现以下错误:

  • -----------这是我的文件服务---------------------我使用的是spring boot 2.2.2 -------这是我的文件控制器-------- 进程已完成,退出代码为%1

  • 问题内容: 我正在尝试从Oracle网站[fxml教程](http://docs.oracle.com/javase/8/javafx/get-started- tutorial/fxml_tutorial.htm )上的JavaFX教程。 这是我不断得到的例外。该应用程序未显示在屏幕上。我从另一个堆栈溢出答案中完成了非args Main()构造函数,但没有解决。 问题答案: 缺少初始关键字。 也

  • 问题内容: 这似乎是最容易的事情,但它没有用。在普通的浏览器中,.html和.js文件可完美运行,但在Chrome扩展程序中,该功能无法执行应有的功能。 .js文件: .html文件: 因此,基本上,一旦用户单击“ hyhy”,“ ha”应更改为“ xxx”。再说一次- 它在浏览器中完美运行,但在扩展程序中不起作用。你知道为什么吗?以防万一我还要在下面附加manifest.json。 提前致谢!

  • 我的映射器是: 如果我删除列表freq并改为字符串freq,它可以工作,但我的JSON可以包含一个或多个freq,所以我需要创建一个列表。我得到的异常如下: