我正在尝试使用Retrofit和Jackson来反序列化一个API。我得到的onFailure错误没有创造者,像默认构造,存在):不能从对象值反序列化(没有委托或基于属性的创造者。
当前回答
只需要添加@NoArgsConstructor就可以了。
其他回答
原因:发生此错误是因为jackson库不知道如何创建没有空构造函数的模型,并且模型包含带有参数的构造函数,该构造函数没有使用@JsonProperty("field_name")注释其参数。默认情况下,如果你没有给你的类添加构造函数,java编译器会创建空构造函数。
解决方案: 向模型中添加一个空构造函数或使用@JsonProperty("field_name")注释构造函数参数
如果你使用Kotlin数据类,那么也可以用@JsonProperty("field_name")进行注释,或者将jackson模块Kotlin注册到ObjectMapper。
您可以使用http://www.jsonschema2pojo.org/创建您的模型。
我通过添加一个无参数的构造函数解决了这个问题。如果你正在使用Lombok,你只需要添加@NoArgsConstructor注释:
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
@EqualsAndHashCode
public class User {
private Long userId;
private String shortName;
}
我用龙目岛。我得到的错误,因为我没有把@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?
只是想指出这个答案提供了一个更好的解释。 基本上你可以同时使用@Getter和@NoArgConstructor 或者让Lombok使用Lombok再生@ConstructorProperties。配置文件, 或者用-parameters标记编译Java项目, 或者让杰克逊使用龙目岛的@Builder
推荐文章
- 在android中从上下文获取活动
- 如何在JSON中使用杰克逊更改字段名
- 无法解析主机"<URL here>"没有与主机名关联的地址
- getActivity()在Fragment函数中返回null
- 按钮背景是透明的
- 在Mac OS X上哪里安装Android SDK ?
- 我如何获得图像缩放功能?
- 在Android应用程序中显示当前时间和日期
- BottomSheetDialogFragment的圆角
- 在应用程序启动时出现“无法获得BatchedBridge,请确保您的bundle被正确打包”的错误
- 我如何改变默认对话框按钮的文本颜色在安卓5
- 如何将字符串转换为长在Kotlin?
- 更改单选按钮的圆圈颜色
- 如何在android中复制一个文件?
- adb找不到我的设备/手机(MacOS X)