我正在尝试使用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,
...