Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Магия маршаллинга с JAXB

@XmlRootElement(name = "graph") @XmlAccessorType(XmlAccessType.NONE) public class Class1 {
public List i1;
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 getI1() { return i1; }
public void setI1(List i1) { if (this.i1 == null) { this.i1 = new ArrayList<>(); }
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 i1) { if (this.i1 == null) { this.i1 = new ArrayList<>(); }
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]}

Комментариев нет:

Отправить комментарий