2016-02-03 2 views
0

Во-первых, я использую Spring MVC.Весна не сериализуется HashMap Атрибут

У меня есть «умение» -modelclass, где я поместил @JsonIgnoreProperties

@JsonIgnoreProperties({"personSkills","berufsgruppes","skills"}) 
@JsonPropertyOrder({"idSkill", "name", "levelBezeichnung", "skill"}) 

Я использую его, потому что есть много-ко-многим или многие-к-одному или один-ко-многим отношений и без этого свойства вызывает StackOverFlowException (Бесконечная ошибка). Один навык может иметь много навыков, поэтому существует своего рода рекурсия.

Я реализовал подкласс для «умения» с именем «SkillBean», который имеет еще один атрибут «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; 
} 
} 

Im Использование BeanUtils.copyProperties() скопировать Skill-Object в SkillBean-Object. Это прекрасно работает. Мне нужно переупорядочить навыки, потому что в настоящее время я получаю наименьшее значение Child-Skill, а не его родителя. Для этого я пытаюсь переупорядочить объекты и пытаться построить дерево в списке. У каждого навыка есть Набор своих детей.

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; 

Но список оленья кожа вернуть Sub-Skillset Может кто-нибудь сказать мне, почему subskills не сериализовать? Когда я возвращаю подмножество этого родительского навыка, их подсечки сериализуются.

0: { 
"idSkill": 34 
"name": "Methodik" 
"levelBezeichnung": { 
    "@id": 1 
    "idLevelBezeichnung": 1 
    "bezeichnung": "Standard" 
    "handler": {} 
    "hibernateLazyInitializer": {} 
}- 
"checked": true 
} 

без переназначения это выглядит, как это н, но проблема заключается в том, что умение с идентификатором = 34 является родителем умение и 9 является subskill. Я хочу, чтобы все было наоборот. Там может быть три уровня.

9: { 
"idSkill": 9 
"name": "Standards" 
"levelBezeichnung": { 
    "@id": 1 
    "idLevelBezeichnung": 1 
    "bezeichnung": "Standard" 
    "handler": {} 
    "hibernateLazyInitializer": {} 
}- 
"skill": { 
    "idSkill": 34 
    "name": "Methodik" 
    "levelBezeichnung": 1 
}- 
"checked": true 
} 
+0

Я не совсем понимаю ваш вопрос.Это проблема с сопоставлением JPA, сопоставлением JSON или некоторой частью вашего кода (возможно, какая-то часть, которую вы еще не показали нам)? Вы отлаживали свой код, чтобы узнать, где он начинает ошибаться? – Thomas

+0

Btw, название свойства «berufsgruppes» заставляет меня содрогнуться;) – Thomas

+0

Я отлаживал его, а в постуслуги навыка есть hashMap с субкиллами, но сериализация кажется неправильной, и я не знаю, почему и как найти ошибку. Поэтому я не думаю, что это часть моего кода. Так что честно, я не знаю, что это JPA или JSON. Классы моделей генерируются спящим режимом. Я знаю, что вы имеете в виду: P – Andy

ответ

0

Наконец, я в конечном итоге с этим:

  1. Игнорировать родительский навык или игнорировать детей навыка, чтобы избежать бесконечной рекурсии. В некоторых случаях вам не нужно игнорировать один из них. Если у вас не так много данных, это может сработать. Я говорю о 150 узлах, где каждый узел знает своего родителя/детей.

  2. Я запрашиваю путь от дна до вершины моего самого низкого навыка с помощью специального запроса sql.

  3. Я размещаю все свои навыки на самом высоком уровне на карте. Это означает, что у меня есть доступ ко всем моим навыкам, потому что (как я сказал) каждый узел знает своих детей.

  4. Я ищу на своей карте сверху вниз и удаляю все ссылки, которые мне не нужны, на основе пути, который у меня уже есть.

Весь код немного сложный, и я использую рекурсию, чтобы сделать ее менее сложной. В конце концов, я не доволен этим решением, потому что в нем много циклов, и до сих пор у меня проблемы с проблемами производительности.

Мне нужно выяснить, является ли проблема с запросом базы данных или проблемой, вызванной циклами.

Смежные вопросы