我正在使用 JAXB 的 EclipseLink 实现(2.3)将 POJO 映射到 XML,并遇到以下用例的问题:
public abstract class A {
public abstract Set<X> getX();
// There is no setter
}
public class B extends A {
// Set via constructor
private Set<X> x;
@Override
public Set<X> getX();
}
我在外部绑定文件中完全定义映射本身,我将 A 类设置为瞬态,如下所示:
<java-type name="foo.A" xml-transient="true"/>
对于 B 类:
<java-type name="bar.B" xml-accessor-type="PROPERTY">
<xml-root-element name="B" />
<java-attributes>
<xml-element java-attribute="x" xml-path="..."/>
</java-attributes>
</java-type>
现在,在编组时,我得到了异常:“在类 [bar.B] 上找到名为 [x] 的重复属性”,我认为它来自 A 中的抽象声明,被 B 继承。
将 B 的访问器类型设置为 FIELD,消除了这个错误,不幸的是,这不是一个选项,因为我在 B 中有一个额外的属性来编组,它不返回字段而是计算值,所以我被 PROPERTY 卡住了(以下工作:将 B 的访问器类型设置为 FIELD 并使用 @XmlPath 注释映射额外的属性 - 但我不想在我的代码中添加注释)。
被 B 类的访问器类型属性卡住了,我的下一个尝试是:
<java-type name="foo.A" xml-accessor-type="NONE"/>
防止抽象属性被B继承,这让我:
Ignoring attribute [x] on class [bar.B] as no Property was generated for it.
使用此映射也会发生同样的情况:
<java-type name="foo.A" xml-accessor-type="PROPERTY">
<java-attributes>
<xml-transient java-attribute="x"/>
</java-attributes>
</java-type>
在这两种情况下,属性“x”都会被忽略。
我现在真的花了很多时间在这上面 - 我无法想象它不可能让它工作?
我目前的解决方法:
将 foo.A 保留为瞬态,为 bar.B 指定访问器类型 FIELD(这让我没有问题地获得属性“x”)并使用代码中的注释映射 B 中的额外属性。但如前所述:我想在没有注释的情况下完全解决这个问题——有人知道吗?布莱斯?:)
问候,
--qu