我正在尝试使用Retrofit和Jackson来反序列化一个API。我得到的onFailure错误没有创造者,像默认构造,存在):不能从对象值反序列化(没有委托或基于属性的创造者。
当前回答
我用龙目岛。我得到的错误,因为我没有把@NoArgsConstructor在我的模型类。
其他回答
通过添加@NoArgsConstructor,它将修复这个问题。 因为如果我们没有提供任何构造函数,编译器将添加默认构造函数,但如果我们添加了任何参数化构造函数,并且错过添加NoArgsConstructor,我们将得到这个异常。我们应该强制添加默认构造函数。
扩展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?
我在这里搜索这个错误:
No Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator
与Retrofit无关,但如果您正在使用Jackson,则通过向抛出错误的类添加默认构造函数来解决此错误。 更多信息请点击:https://www.baeldung.com/jackson-exception
我加上我的答案,因为我自己,由于我的疏忽,遇到了这个错误。
导入静态对象时不小心引入了错误的序列化器,很长时间都不明白是什么原因。也许这能帮到别人。
// Wrong serializer via static object import
import static org.keycloak.util.JsonSerialization.mapper;
小心些而已。
您需要使用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来执行反序列化。
推荐文章
- 警告:API ' variable . getjavacompile()'已过时,已被' variable . getjavacompileprovider()'取代
- 安装APK时出现错误
- 碎片中的onCreateOptionsMenu
- TextView粗体通过XML文件?
- 如何使线性布局的孩子之间的空间?
- DSL元素android.dataBinding。enabled'已过时,已被'android.buildFeatures.dataBinding'取代
- ConstraintLayout:以编程方式更改约束
- PANIC: AVD系统路径损坏。检查ANDROID_SDK_ROOT值
- Kotlin中惯用的登录方式
- 如何生成字符串类型的buildConfigField
- Recyclerview不调用onCreateViewHolder
- Android API 21工具栏填充
- Android L中不支持操作栏导航模式
- 将JsonNode转换为POJO
- 杰克逊克服下划线,支持骆驼案