java Spring没有序列化HashMap属性
首先,我使用的是Spring MVC
我有一个“技能”-model类,在那里我放置了@JsonIgnoreProperties
@JsonIgnoreProperties({"personSkills","berufsgruppes","skills"})
@JsonPropertyOrder({"idSkill", "name", "levelBezeichnung", "skill"})
我之所以使用它,是因为存在多对多或多对一或一对多关系,如果没有此属性,它将导致StackOverFlowException(无限错误)。一种技能可以有多种技能,因此存在一种递归
我为“SkillBean”实现了一个名为“SkillBean”的“Skill”的子类,它还有一个属性“checked”,它只与应用程序相关,而不与数据库相关
public class Skill implements java.io.Serializable {
private Set<Skill> skills = new HashSet<Skill>(0);
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "skill")
public Set<Skill> getSkills() {
return this.skills;
}
public void setSkills(Set<Skill> skills) {
this.skills = skills;
}
public class SkillBean extends Skill implements Serializable{
public boolean checked;
public SkillBean() {
}
public SkillBean(Skill skill, boolean checked) {
this.checked = checked;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
}
我用的是小海狸。copyProperties()将技能对象复制到SkillBean对象中。这个很好用。我需要重新排列技能,因为目前我首先获得的是最低的子技能,而不是它的父技能。为此,我尝试对对象重新排序,并尝试在列表中构建一棵树。每一项技能都有其子技能
private ArrayList<SkillBean> formatSkillMap(HashMap<Integer, SkillBean> map) {
Map<Integer, SkillBean> tempSkills = (Map<Integer, SkillBean>) map.entrySet().stream().filter(p -> p.getValue().getSkill() == null)
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
ArrayList<SkillBean> list = new ArrayList<SkillBean>(tempSkills.values());
for (int i = 0; i < list.size(); i++) {
SkillBean sb = list.get(i);
tempSkills = (Map<Integer, SkillBean>) map.entrySet().stream().filter(p -> p.getValue().getSkill() != null)
.filter(p -> p.getValue().getSkill().getIdSkill() == sb.getIdSkill()).collect(Collectors.toMap(Entry::getKey, Entry::getValue));
Set<Skill> test = new HashSet<Skill>(tempSkills.values());
list.get(i).setSkills(test);
}
return list;
但是列表没有返回子技能集有人能告诉我为什么子技能没有序列化吗?当我返回这个父技能的子集时,它们的子技能被序列化
0: {
"idSkill": 34
"name": "Methodik"
"levelBezeichnung": {
"@id": 1
"idLevelBezeichnung": 1
"bezeichnung": "Standard"
"handler": {}
"hibernateLazyInitializer": {}
}-
"checked": true
}
如果不重新排序,它看起来像这样,但问题是id=34的技能是父技能,9是子技能。我想要的正好相反。可能有三个层次
9: {
"idSkill": 9
"name": "Standards"
"levelBezeichnung": {
"@id": 1
"idLevelBezeichnung": 1
"bezeichnung": "Standard"
"handler": {}
"hibernateLazyInitializer": {}
}-
"skill": {
"idSkill": 34
"name": "Methodik"
"levelBezeichnung": 1
}-
"checked": true
}
# 1 楼答案
最后,我得出以下结论:
忽略技能的父项或子项以避免无限递归在某些情况下,您不需要忽略其中一个。如果你没有那么多的数据,它可以工作我说的是150个节点,每个节点都知道它的父节点/子节点
我用一个自定义sql查询来查询我的最低技能从下到上的路径
我把我所有的技能都放在地图的最高层次上。这意味着,我可以使用我的所有技能,因为(正如我所说)每个节点都知道自己的孩子
我正在从上到下搜索我的地图,并根据我已经得到的路径删除所有我不需要的引用
整个代码有点复杂,我正在使用递归使其不那么复杂。最后,我对这个解决方案不是很满意,因为它有很多循环,到目前为止,我在性能问题上遇到了一些麻烦
我需要发现这是一个数据库查询问题还是由循环引起的问题