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


当前回答

我通过添加一个无参数的构造函数解决了这个问题。如果你正在使用Lombok,你只需要添加@NoArgsConstructor注释:

@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
@EqualsAndHashCode
public class User {
    private Long userId;
    private String shortName;
}

其他回答

我得到了同样的错误,问题是我的模型没有实现Serializable,所以检查这个以及,可能会有所帮助,因为这也是原因之一。

您需要使用jackson-module-kotlin反序列化到数据类。详情请看这里。

上面的错误消息是Jackson给你的,如果你试图反序列化一些值到一个数据类,而该模块没有启用,或者即使启用了,当它使用的ObjectMapper没有注册KotlinModule时。例如,下面的代码:

data class TestDataClass (val foo: String)

val jsonString = """{ "foo": "bar" }"""
val deserializedValue = ObjectMapper().readerFor(TestDataClass::class.java).readValue<TestDataClass>(jsonString)

这将失败,并出现以下错误:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `test.SerializationTests$TestDataClass` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)

如果您更改上面的代码并将ObjectMapper替换为jacksonObjectMapper(它只是返回一个注册了KotlinModule的普通ObjectMapper),它就可以工作。即。

val deserializedValue = jacksonObjectMapper().readerFor(TestDataClass::class.java).readValue<TestDataClass>(jsonString)

我不确定Android方面的情况,但看起来您需要让系统使用jacksonObjectMapper来执行反序列化。

Bek的答案是正确的。

但如果有人试图在restcontroller中使用不可变类,即他们正在使用lombok的@value,那么你需要添加lombok. anyconstructor . addconstructorproperties =true

您可以创建一个名为lombok的文件。在根文件pom.xml所在的相同位置进行配置,并将这一行添加到文件中

https://stackoverflow.com/a/56022839/6700081

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

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

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

如果使用lombok,则可以使用@Jacksonized注释。

您不需要设置器——这个注释使用@Value可以很好地工作。

你不需要@NoArgsConstructor -你可以使用@Builder或@RequiredArgsConstructor。