我的Dto的Jackson反序列化出现问题。我使用的是Lombok 1.18.16和Jackson(Jackson数据绑定(2.11.3
我的课程是这样的:
@Data
public class Dto {
@JsonProperty("ID")
private Long id;
@JsonProperty("STATUS")
private Long status
@JsonProperty("CONTACT_ID")
private Long contactId;
@JsonProperty("TITLES")
private List<Text> titles;
@JsonProperty("DESCRIPTIONS")
private List<Text> descriptions;
}
文本类别如下:
@Data(staticConstructor = "of")
public class Text {
@JsonProperty("ID")
private final Long id;
@JsonProperty("LABEL")
private final String label;
}
当Jackson对此进行解析时,我得到了如下异常:
Cannot construct instance of `com.mycompany.Text` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 35, column: 13] (through reference chain: com.mycompany.Dto["TITLES"]->java.util.ArrayList[0])
我知道这与我的Text类的构造函数有关,但我不确定为什么——因为我是通过Lombok提供构造函数的。
我使用的JSON如下所示:
{
"ID": "1",
"STATUS": "1",
"CONTACT_ID": "1",
"TITLES": [
{
"ID": 215,
"LABEL": "Title"
}
],
"DESCRIPTIONS": [
{ "ID":"0", "LABEL":"Description" }
]
}
我错过了什么?此外,有没有一种方法可以使用Lombok为构造函数创建一个可选参数?当我想创建一个新标题时(那么id还不存在(,就会出现这种情况。
感谢您的意见!
您缺少@NoArgsConstructor。
@NoArgsConstructor
public class Text {
...
}
当您使用@data
时,您包括@Getter
、@Setter
、@ToString
、@EqualsAndHashCode
和@RequiredArgsConstructor
,因为jackson需要反序列化默认构造函数,您应该添加@NoArgsConstructor。