【发布时间】:2014-07-03 02:10:39
【问题描述】:
下面的代码曾经在 JDK 1.7 使用的 JAXB 实现下工作,但现在在 JDK 1.8 下它被破坏了。在下面的代码中,您会发现似乎使它在 1.8 中起作用的关键更改。 1.8 下的“修复”并不是真正的修复,因为公开内部集合以供外部世界直接修改是不好的做法。我想通过我的班级控制对内部列表的访问,我不想通过制作可观察的集合并收听它们来使事情复杂化。这是不可接受的。
有什么方法可以让我的原始代码在 JD 1.8 的 JAXB 下工作?
@XmlElementWrapper(name = "Wrap")
@XmlElement(name = "Item", required = true)
public synchronized void setList(List<CustomObject> values) {
list.clear();
list.addAll(values);
}
public synchronized List<CustomObject> getList() {
// return new ArrayList(list); // this was the original code that worked under 1.7
return list; //this is the only thing that works under 1.8
}
经过更多分析,问题似乎来自 JAXB 不再为集合调用 setter 方法(它曾经在 JDK 1.7 下)。现在在 JDK 1.8 下,它调用 getter 并直接修改集合。这带来了几个问题:
1-强制用户将内部集合暴露给外界以供免费修改(不好的做法) 2-不允许用户在列表更改时执行任何自定义代码(例如,如果调用了 setter,您可以做什么)。可以创建一个可观察的集合并监听它,但这比调用 setter 方法要复杂得多。
【问题讨论】:
-
我也从 NetBeans 7.4 更新到了 8.0,这似乎也有影响。
标签: xml-parsing jaxb migration java-8 persistence