JSON 和 Lombok 构造函数的 Jackson 反序列化问题
Problem Jackson deserialization of JSON and Lombok constructor
我的 Dto 的 Jackson 反序列化有问题。我正在使用 Lombok 1.18.16 和 Jackson (jackson-databind) 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;
}
text-Class是这样的:
@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-class 的构造函数有关,但我不确定为什么 - 因为我是通过 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
,因为杰克逊需要为了反序列化默认构造函数,您应该添加 @NoArgsConstructor.
我的 Dto 的 Jackson 反序列化有问题。我正在使用 Lombok 1.18.16 和 Jackson (jackson-databind) 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;
}
text-Class是这样的:
@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-class 的构造函数有关,但我不确定为什么 - 因为我是通过 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
,因为杰克逊需要为了反序列化默认构造函数,您应该添加 @NoArgsConstructor.