我正在尝试使用Retrofit和Jackson来反序列化一个API。我得到的onFailure错误没有创造者,像默认构造,存在):不能从对象值反序列化(没有委托或基于属性的创造者。
当前回答
如果你使用Unirest作为http库,使用GsonObjectMapper而不是JacksonObjectMapper也可以工作。
<!-- https://mvnrepository.com/artifact/com.konghq/unirest-object-mappers-gson -->
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-object-mappers-gson</artifactId>
<version>2.3.17</version>
</dependency>
Unirest.config().objectMapper = GsonObjectMapper()
其他回答
我得到了同样的错误,在我添加了一个没有参数的构造函数后,问题就解决了。
Bek的答案是正确的。
但如果有人试图在restcontroller中使用不可变类,即他们正在使用lombok的@value,那么你需要添加lombok. anyconstructor . addconstructorproperties =true
您可以创建一个名为lombok的文件。在根文件pom.xml所在的相同位置进行配置,并将这一行添加到文件中
https://stackoverflow.com/a/56022839/6700081
如果您在POJO模型上使用Lombok,请确保您有这些注释:
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
它可以有所不同,但要确保@Getter,特别是@NoArgsConstructor。
我用Quarkus, Jackson和Lombok。所以我通过在模型类上添加@Jacksonized属性解决了这个问题。 所以所有的属性是:
@Jacksonized //missing
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ...
您需要使用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来执行反序列化。
推荐文章
- 视图绑定-我如何获得包含布局的绑定?
- 在Android Studio中改变矢量资产的填充颜色
- 在构建中编写注释的语法是什么?gradle文件?
- 如何以编程方式添加按钮色调
- 用Android Studio进行调试永远停留在“等待调试器”状态
- Openssl不被视为内部或外部命令
- 无法执行dex:在Eclipse中超过GC开销限制
- 如何以编程方式将视图添加到视图
- 单击url会打开默认浏览器
- 使用Retrofit刷新OAuth令牌,而不修改所有调用
- 多个dex文件定义了landoid /support/v4/accessibilityservice/AccessibilityServiceInfoCompat
- 如何获得动作栏的高度?
- 从活动外部调用startActivity() ?
- createScaledBitmap的过滤器参数做什么?
- 为什么我在使用adb时访问数据文件夹被拒绝?