我正在尝试使用Retrofit和Jackson来反序列化一个API。我得到的onFailure错误没有创造者,像默认构造,存在):不能从对象值反序列化(没有委托或基于属性的创造者。
当前回答
原因:发生此错误是因为jackson库不知道如何创建没有空构造函数的模型,并且模型包含带有参数的构造函数,该构造函数没有使用@JsonProperty("field_name")注释其参数。默认情况下,如果你没有给你的类添加构造函数,java编译器会创建空构造函数。
解决方案: 向模型中添加一个空构造函数或使用@JsonProperty("field_name")注释构造函数参数
如果你使用Kotlin数据类,那么也可以用@JsonProperty("field_name")进行注释,或者将jackson模块Kotlin注册到ObjectMapper。
您可以使用http://www.jsonschema2pojo.org/创建您的模型。
其他回答
我在这里搜索这个错误:
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
如果您在POJO模型上使用Lombok,请确保您有这些注释:
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
它可以有所不同,但要确保@Getter,特别是@NoArgsConstructor。
在我的案例中,问题只发生在构建类型发布中,是由于包含存根的“\dto”文件夹中的一些类被模糊了。 为了解决这个问题,我在proguard-rules中添加了以下规则。支持文件:
-keep public class com.your.app_package.dto.** { *; }
-keep @**annotation** class * {*;}
#Preserve JacksonXml (PUBLIC_ONLY crash fix)
-keepattributes *Annotation*,EnclosingMethod,Signature
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**
-keep class org.codehaus.** { *; }
-keepclassmembers public final enum com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility {
public static final com.fasterxml.jackson.annotation.JsonAutoDetect$Visibility *; }
我通过添加一个无参数的构造函数解决了这个问题。如果你正在使用Lombok,你只需要添加@NoArgsConstructor注释:
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
@EqualsAndHashCode
public class User {
private Long userId;
private String shortName;
}
只需要添加@NoArgsConstructor就可以了。
推荐文章
- apk (.apk)和应用程序包(.aab)的区别
- Kotlin中的单个感叹号
- 如何设置超时在改造库?
- 使用Jackson将JSON字符串转换为漂亮的打印JSON输出
- Android - SPAN_EXCLUSIVE_EXCLUSIVE跨度不能为零长度
- TextView的字体大小在Android应用程序改变字体大小从本机设置
- 如何模拟Android杀死我的进程
- 禁用EditText闪烁光标
- Android Eclipse -无法找到*.apk
- 设置TextView文本从html格式的字符串资源在XML
- 如何允许所有网络连接类型HTTP和HTTPS在Android(9)馅饼?
- 如何克隆或复制一个列表在kotlin
- Android加载JS包失败
- Android Studio, logcat在应用程序关闭后清理
- 在android中从上下文获取活动