我正在尝试使用Retrofit和Jackson来反序列化一个API。我得到的onFailure错误没有创造者,像默认构造,存在):不能从对象值反序列化(没有委托或基于属性的创造者。
当前回答
使用Lombok时要小心,尤其是@Builder。
解决这个问题的方法是:
@JsonDeserialize(builder = X.XBuilder.class)
class X{
@JsonPOJOBuilder(withPrefix = "")
public static class XBuilder{
}
}
我希望它能让你的生活更轻松
其他回答
我知道这是一个老帖子,但对于任何使用Retrofit的人来说,这可能是非常有用的。
如果你正在使用Retrofit + Jackson + Kotlin + Data类,你需要:
添加实现组:com.fasterxml.jackson。,名称:' Jackson -module-kotlin',版本:'2.7.1-2'到你的依赖,这样Jackson可以反序列化到数据类 当构建翻新时,传递Kotlin Jackson Mapper,以便翻新使用正确的映射器,例如:
val jsonMapper = com.fasterxml.jackson.module.kotlin.jacksonObjectMapper()
val retrofit = Retrofit.Builder()
...
.addConverterFactory(JacksonConverterFactory.create(jsonMapper))
.build()
注意:如果没有使用Retrofit, @Jayson Minard有一个更一般的方法回答。
在我的案例中,问题只发生在构建类型发布中,是由于包含存根的“\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 *; }
我在这里搜索这个错误:
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
我可以在@JacksonProperty注释的帮助下在Kotlin中解决这个问题。上述情况的用法示例如下:
import com.fasterxml.jackson.annotation.JsonProperty
...
data class Station(
@JacksonProperty("repsol_id") val repsol_id: String,
@JacksonProperty("name") val name: String,
...
我通过添加一个无参数的构造函数解决了这个问题。如果你正在使用Lombok,你只需要添加@NoArgsConstructor注释:
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
@EqualsAndHashCode
public class User {
private Long userId;
private String shortName;
}
推荐文章
- 如何分配文本大小在sp值使用java代码
- Swift 'if let'语句等价于Kotlin
- Manifest合并失败:uses-sdk:minSdkVersion 14
- 为什么Android工作室说“等待调试器”如果我不调试?
- 如何检查我的EditText字段是否为空?
- Android从图库中选择图像
- 后台任务,进度对话框,方向改变-有任何100%工作的解决方案吗?
- Android:垂直对齐多行EditText(文本区域)
- Android无尽列表
- Android room persistent: AppDatabase_Impl不存在
- Java的String[]在Kotlin中等价于什么?
- 错误:执行失败的任务':app:compileDebugKotlin'。>编译错误。详细信息请参见日志
- 在Android中使用URI生成器或使用变量创建URL
- 缩放图像以填充ImageView宽度并保持纵横比
- 列表视图的自定义适配器