【发布时间】:2017-12-23 00:13:57
【问题描述】:
类人:
@Data
public class Person<T extends Parent> implements Serializable {
private static final long serialVersionUID = 7822965786010192978L;
private static final ObjectMapper objectMapper = new ObjectMapper();
private String id;
private T people; // change (String peopleInfo) to object extends Parent after read data from database
private String peopleInfo; // change (T people) to string and save in the dataBase as an string
@SneakyThrows
public void setPeople(T people) {
this.people = people;
peopleInfo = objectMapper.writeValueAsString(people);
}
@SneakyThrows
public void setPeopleInfo(String peopleInfo) {
this.peopleInfo = peopleInfo;
if (!Strings.isNullOrEmpty(peopleInfo)) {
people = objectMapper.readValue(peopleInfo, new TypeReference<T>() {});
}
}
}
班级家长:
@Data
public class Parent implements Serializable {
private static final long serialVersionUID = 2092353331893381153L;
private String name;
}
类孩子:
@Data
public class Child extends Parent {
private static final long serialVersionUID = 3318503314202792570L;
private String pocketMoney;
}
和测试功能:我想将persnInfo保存到数据库中为String,并在从数据库中读取数据后自动将string更改为对象people。
@Test
public void testReadData() throws Exception {
Child child = new Child();
child.setName("_child");
child.setPocketMoney("10$");
Person<Child> person = new Person<>();
person.setId("1");
person.setPeople(child);
// assume this json was read from database
String json = person.getPeopleInfo();
System.out.println(json);
Person<Child> readPerson = new Person<>();
readPerson.setId("1");
readPerson.setPeopleInfo(json);
Child readChild = readPerson.getPeople();
System.out.println(readChild.getPocketMoney());
}
发生错误:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“pocketMoney”(类pers.test.common.objmapper.Parent),未标记为可忽略(一个已知属性:“名称”])
在 [来源:{"name":"_child","pocketMoney":"10$"}; line: 1, column: 33](通过引用链:pers.test.common.objmapper.Parent["pocketMoney"])
在 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:51)
我不知道如何解决这个问题,任何人都可以在不更改 testReadData()' but change the modelPeople` 的情况下帮助我让它通过。
【问题讨论】:
-
@GhostCat 在
Person.setPeopleInfo ()people = objectMapper.readValue(peopleInfo, new TypeReference<T>() {});
标签: java generics jackson deserialization