【问题标题】:Spring Boot 3 native image with Jackson带有 Jackson 的 Spring Boot 3 本机图像
【发布时间】:2023-02-24 14:43:47
【问题描述】:

我正在尝试使用最新的 SpringBoot 3 设置一个新应用程序并且一切正常,直到我尝试使用本机编译创建和运行我的应用程序。仅供您参考,这是我从运行单元测试中收到的错误:

     Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `*****`: cannot deserialize from Object value (no delegate- or property-based Creator): this appears to be a native image, in which case you may need to configure reflection for the class that is to be deserialized
 at [Source: (String)"[{"T":"success","msg":"authenticated"}]"; line: 1, column: 3] (through reference chain: java.util.ArrayList[0])
       com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1909)
       com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:408)
       com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1349)
       com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1417)
       com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352)

我正在尝试将 JSON 字符串转换为对象。当我将它作为常规 JAR 运行时它工作正常,但是当我使用 Navite (GraalVM) 编译时它失败了。

【问题讨论】:

    标签: spring-boot jackson spring-native


    【解决方案1】:

    在 spring native 中,Jackson 不知道如何在没有先验知识的情况下序列化/反序列化对象,因为它必须知道编译时的所有类型。
    要在本机模式下运行您的应用程序,您需要注册提示,了解所需的代理、反射方法、其他资源文件/路径或要序列化/反序列化的对象。
    为此,实现 RuntimeHintsRegistrar 接口。你可以在docs中看到一个例子

    【讨论】:

    • 感谢您的帮助和文档,我缺少关于如何向本机图像提供提示的文档的这一部分!!!
    【解决方案2】:

    在使用 RestTemplateWebClient 时,您可能希望使用 @RegisterReflectionForBinding 注释与 jackson 进行 JSON 映射。更多信息在docs

    @RegisterReflectionForBinding({MyObject.class})
    

    【讨论】:

      猜你喜欢
      • 2020-10-01
      • 2023-01-26
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 2018-01-25
      • 2019-10-09
      • 2022-01-04
      • 2018-05-21
      相关资源
      最近更新 更多