【发布时间】:2019-08-03 11:15:12
【问题描述】:
当我在嵌套字段上使用 @JsonUnwrapped 时:
public class Person{
private int id;
@JsonUnwrapped
private Father father
//getters/setters
@Data
@AllArgsConstructor
private static class Father {
private String name;
private String surname;
}
同时我使用@JsonCreator:
@JsonCreator // DESERIALIZATION: JSON -> POJO
public Person(...
@JsonProperty("name") String name,
@JsonProperty("surname") String surname) {
(...)
this.father = new Father(name, surname);
Father 是嵌套类。
我得到错误:
Father` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creat
但是当我删除 @JsonUnwrapped 时,该字段可以反序列化,但在序列化过程中不会变平。
How to assure that Father field will be serialised and deserialised flatten at the same time?
编辑:
我粘贴完整代码:
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Person {
private int id;
private String firstName;
private String lastName;
private boolean active;
private Address address;
private String[] languages;
@JsonIgnore private boolean isTheKing;
@JsonUnwrapped // SERIALIZATIONL POJO -> JSON
private Father father;
@JsonCreator // DESERIALIZATION: JSON -> POJO
public Student(
@JsonProperty("id") int id,
@JsonProperty("firstName") String firstName,
@JsonProperty("lastName") String lastName,
@JsonProperty("active") boolean active,
@JsonProperty("address") Address address,
@JsonProperty("languages") String[] languages,
@JsonProperty("isTheKing") boolean isTheKing,
@JsonProperty("name") String name,
@JsonProperty("surname") String surname) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.active = active;
this.address = address;
this.languages = languages;
this.isTheKing = isTheKing;
this.father = new Father(name, surname);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String[] getLanguages() {
return languages;
}
public void setLanguages(String[] languages) {
this.languages = languages;
}
public Father getFather() {
return father;
}
public void setFather(Father father) {
this.father = father;
}
@Data
@AllArgsConstructor
static class Father {
private String name;
private String surname;
}
}
以下主要方法失败:
ObjectMapper mapper = new ObjectMapper();
Person myStudent =
mapper.readValue(new File("src/main/resources/data/rest/studentIN.json"), Person.class);
System.out.println(myStudent);
有错误:
线程“main”中的异常 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:不能 构造
com.example.demo.Person$Father的实例 (不存在像默认构造一样的创建者):无法反序列化 对象值(无委托或基于属性的 Creator)
我使用龙目岛:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
【问题讨论】:
-
您使用哪个版本的
Jackson?为什么Father类被声明为private static class?它对其他类不可见。 -
@MichałZiober 请参阅有问题的编辑,其中我附上了不起作用的完整代码。我已将可见性更改为
package-scope,但问题仍然存在。我还附上了我使用的 lombok 依赖版本。 -
尝试将
@NoArgsConstructor添加到您的father课程中。 -
@MichałZiober 当我添加它时,错误消失了,但
name和surname是空值。可能是因为 noarg constr 被调用了。所以还是没有运气。 -
您能否删除
lombok注释以查看结果。如果它会起作用,我们知道lombok搞砸了POJO类。