【问题标题】:Jackson: "(although at least one Creator exists): no String-argument constructor/factory method to deserialize"Jackson:“(尽管至少存在一个 Creator):没有要反序列化的字符串参数构造函数/工厂方法”
【发布时间】:2021-09-17 09:58:47
【问题描述】:

虽然这个问题听起来很简单,但我在一个非常简单的 bean 上也遇到了这个异常:

@Data
public class Foo {
  private List<Error> errors;

  @Data
  public static class Error {
    private int code;
    private String message;
  }
}

JSON:

{
  "errors": [
    "message": "bla bla bla"
  ]
}

例外:com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of "org.example.app.Foo$Error" (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('message')

应用程序:

@SpringBootApplication
public class Application {
  public static void main(String[] args) throws Exception {
    ApplicationContext context = SpringApplication.run(Application.class, args);
    ObjectMapper objectMapper = context.getBean(ObjectMapper.class);
    Resource resource = new ClassPathResource("request.json");
    try (InputStream stream = resource.getInputStream()) {
        Foo foo = objectMapper.readValue(stream, Foo.class);
        System.out.println(foo);
    }
  }
}

JSON 文件位于类路径中。

我尝试过的:

  1. Error 类上的显式 @AllArgsConstructor Lombok 注释
  2. int code 切换到Integer code(可空类型)
  3. Error 类移出Foo(非内部类)

【问题讨论】:

  • 这不是有效的 JSON。 message 应该在一个对象中。
  • 您的 JSON 无效,除非您在此处复制时打错字..
  • 天啊!我不敢相信。谢谢你们!

标签: java json spring deserialization lombok


【解决方案1】:

考虑使用 @Jacksonized 注释和 @Builder 按照

https://projectlombok.org/features/experimental/Jacksonized

修复您的 json 对象以及它的格式错误。 “错误”正在使用对象数组,所以你应该有类似的东西:

{
    "errors": [{
        "message": "bla bla bla"
    }]
}

【讨论】:

  • 您能否更新您的答案以包括上面所说的内容?
  • 如果我的答案是正确的并且你对它感到满意,请标记我的答案:)
猜你喜欢
  • 1970-01-01
  • 2018-11-22
  • 2022-12-12
  • 2021-09-22
  • 1970-01-01
  • 2021-01-30
  • 2017-03-03
  • 2018-09-09
  • 1970-01-01
相关资源
最近更新 更多