我正在尝试使用Retrofit和Jackson来反序列化一个API。我得到的onFailure错误没有创造者,像默认构造,存在):不能从对象值反序列化(没有委托或基于属性的创造者。


当前回答

我有这个问题,我修复了下面的代码。

@Configuration
open class JacksonMapper {

    @Bean
    open fun mapper(): ObjectMapper {
        val mapper = ObjectMapper()
        ...

        mapper.registerModule(KotlinModule())
        return mapper
    }
}

其他回答

我有这个问题,我修复了下面的代码。

@Configuration
open class JacksonMapper {

    @Bean
    open fun mapper(): ObjectMapper {
        val mapper = ObjectMapper()
        ...

        mapper.registerModule(KotlinModule())
        return mapper
    }
}

对于我们没有默认构造的类,例如当使用不可变对象时,Jackson默认情况下将不能将JSON反序列化为对象。 我们可以使用一些注释来解决这个问题,比如@JsonCreator,它可以帮助Jackson知道如何反序列化给定的JSON。

示例代码如下所示:

package com.test.hello;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Payment {

    private final Card card;

    private final Amount amount;

    @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
    public Payment(@JsonProperty("card") Card card, @JsonProperty("amount") Amount amount) {
       this.card = card;
       this.amount = amount;
    }

    public Card getCard() {
       return card;
    }

    public Amount getAmount() {
        return amount;
    }
}

我加上我的答案,因为我自己,由于我的疏忽,遇到了这个错误。

导入静态对象时不小心引入了错误的序列化器,很长时间都不明白是什么原因。也许这能帮到别人。

// Wrong serializer via static object import
import static org.keycloak.util.JsonSerialization.mapper;

小心些而已。

在我的案例中,问题只发生在构建类型发布中,是由于包含存根的“\dto”文件夹中的一些类被模糊了。 为了解决这个问题,我在proguard-rules中添加了以下规则。支持文件:

-keep public class com.your.app_package.dto.** { *; }

-keep @**annotation** class * {*;}

#Preserve JacksonXml (PUBLIC_ONLY crash fix)
-keepattributes *Annotation*,EnclosingMethod,Signature
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**
-keep class org.codehaus.** { *; }
-keepclassmembers public final enum com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility {
    public static final com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility *; }

在下面的用例中遇到相同的错误。

我尝试使用sprint引导(2.0.0快照版本)在各自的bean中没有默认构造函数的情况下达到Rest(Put映射)端点。

但是在最新的Spring Boot版本(2.4.1版本)中,同一段代码可以正常运行。

因此在最新版本的Spring Boot中不再需要bean默认构造函数