@XmlRootElement(name = "graph")
@XmlAccessorType(XmlAccessType.NONE)
public class Class1 {
public List
public Class1(Integer... i1) {
if (this.i1 == null) {
this.i1 = new ArrayList<>();
}
for (Integer Int : i1) {
this.i1.add(Int);
}
}
public Class1() {
}
@XmlElement
public List
public void setI1(List
System.out.println("before: " + this.i1);
this.i1 = i1.stream().map(arg -> arg*2).collect(Collectors.toList());
System.out.println("after: " + this.i1);
}
@Override
public String toString() {
return "Class1{" +
"i1=" + i1 +
'}';
}
}
Опускаю инициализацию JAXB. Вот какой класс будем маршаллить, а потом анмаршаллить(подробности опускаю): new Class1(1,2,3)
результат :
before: [ ]
after: [ ]
Class1{i1=[ ]}
заменяем сеттер на :
public void setI1(List
System.out.println("before: " + this.i1);
this.i1 = i1;
System.out.println("after: " + this.i1);
}
результат:
before: [ ]
after: [ ]
Class1{i1=[1, 2, 3]}
Вопрос, что это за адская магия? И можно ли как-то обрабатывать приходящие в сеттер\геттер значения ?
Ответ
Когда вызывается сеттер в него передается пустой список, который создал JAXB. И вы видите это after: [ ]. Но потом JAXB начинает заполнять этот список элементами. Но т.к. вы в первом случае создаете новый список, заполненный список просто пропадает где-то в недрах JAXB, во втором же случае вы сохраняете именно ссылку на тот список, который потом будет заполненным и в результате видите Class1{i1=[1, 2, 3]}
Комментариев нет:
Отправить комментарий