Я пытался решить ту же проблему и довольно долго играл с образцами здесь. Большое спасибо за них, довольно образовательные.
Тем не менее, было неправильно, что что-то настолько зрелое, как реализация JAXB в JDK 6, будет понимать элементы в XML и бездушно вручать мне код пустого списка.
Оказывается, JAXB заполнял список после вызова моего установщика со ссылкой на все еще пустой список, поэтому, когда мой установочный код выглядел так, он пропустил последующие обновления списка во время остаток фазы демаршаллинга:
@XmlElementWrapper(name = "foos")
@XmlElement(name = "foo")
public void setFoos(List<Foo> newFoos) {
this.foos.clear();
this.foos.addAll(newFoos);
}
Когда я изменил свой сеттер на
@XmlElementWrapper(name = "foos")
@XmlElement(name = "foo")
public void setFoos(List<Foo> newFoos) {
this.foos = newFoos;
}
это работало просто отлично. Держаться за чужой указатель на список всегда неприятно, потому что владелец списка может изменить его после факта, но в этом случае именно это изменение решило проблему.
Я подтвердил свое предположение, перебирая список, переданный JAXB, и, конечно, жаловался на ConcurrentModificationException, свидетельство того, что он действительно работал со списком после передачи его в мой код.