我正在尝试使用Retrofit和Jackson来反序列化一个API。我得到的onFailure错误没有创造者,像默认构造,存在):不能从对象值反序列化(没有委托或基于属性的创造者。
当前回答
当您使用Lombok builder时,您将得到上述错误。
@JsonDeserialize(builder = StationResponse.StationResponseBuilder.class)
public class StationResponse{
//define required properties
}
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonPOJOBuilder(withPrefix = "")
public static class StationResponseBuilder {}
参考:https://projectlombok.org/features/Builder与杰克逊
其他回答
通过添加@NoArgsConstructor,它将修复这个问题。 因为如果我们没有提供任何构造函数,编译器将添加默认构造函数,但如果我们添加了任何参数化构造函数,并且错过添加NoArgsConstructor,我们将得到这个异常。我们应该强制添加默认构造函数。
我得到了同样的错误,问题是我的模型没有实现Serializable,所以检查这个以及,可能会有所帮助,因为这也是原因之一。
如果你使用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()
只是想指出这个答案提供了一个更好的解释。 基本上你可以同时使用@Getter和@NoArgConstructor 或者让Lombok使用Lombok再生@ConstructorProperties。配置文件, 或者用-parameters标记编译Java项目, 或者让杰克逊使用龙目岛的@Builder
我可以在@JacksonProperty注释的帮助下在Kotlin中解决这个问题。上述情况的用法示例如下:
import com.fasterxml.jackson.annotation.JsonProperty
...
data class Station(
@JacksonProperty("repsol_id") val repsol_id: String,
@JacksonProperty("name") val name: String,
...
推荐文章
- 警告: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
- 杰克逊克服下划线,支持骆驼案