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


当前回答

我在Kotlin中也遇到了例外。如果在应用KotlinModule之后仍然有问题,您可能(尽管不太可能)在某个地方有值类。

其他回答

我的问题原因对我来说似乎很不寻常,不确定是否有人在相同的条件下得到错误,我通过不同之前的提交找到了原因,在这里:

通过我的构建。gradle我正在使用这2个编译器选项,并注释掉这一行固定的问题

//compileJava.options.compilerArgs = ['-Xlint:unchecked','-Xlint:deprecation']

我使用rescu与Kotlin,并通过使用@ConstructorProperties解决它

    data class MyResponse @ConstructorProperties("message", "count") constructor(
        val message: String,
        val count: Int
    )

Jackson使用@ConstructorProperties。这应该修复Lombok @Data以及。

扩展Yoni Gibbs的回答,如果你在一个android项目中使用改装和配置序列化与Jackson,你可以做这些事情,以便反序列化工作预期与kotlin的数据类。

在你的build gradle导入中:

implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.11.+"

然后,你的改造实施:

val serverURL = "http://localhost:8080/api/v1"

val objectMapper = ObjectMapper()
objectMapper.registerModule(KotlinModule())
//Only if you are using Java 8's Time API too, require jackson-datatype-jsr310
objectMapper.registerModule(JavaTimeModule())

Retrofit.Builder()
    .baseUrl(serverURL)
    .client(
        OkHttpClient.Builder()
           .readTimeout(1, TimeUnit.MINUTES)//No mandatory
            .connectTimeout(1, TimeUnit.MINUTES)//No mandatory
            .addInterceptor(UnauthorizedHandler())//No mandatory
            .build())
    .addConverterFactory(
                JacksonConverterFactory.create(objectMapper)
            )
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .build()

数据类:

@JsonIgnoreProperties(ignoreUnknown = true)
data class Task(val id: Int,
                val name: String,
                @JsonSerialize(using = LocalDateTimeSerializer::class)
                @JsonDeserialize(using = LocalDateTimeDeserializer::class)
                val specificDate: LocalDateTime?,
                var completed: Boolean,
                val archived: Boolean,
                val taskListId: UUID?

在类中添加构造函数 或 如果您正在使用pojo添加 @NoArgsConstructor @AllArgsConstructor

还要包括JsonProperty - @JsonProperty("name") private List<员工>姓名;

正如错误所提到的,该类没有默认构造函数。

将@NoArgsConstructor添加到实体类中应该可以解决这个问题。