在子类中使用@XmlValue

Make use of @XmlValue in subclass

我让这段代码在 EclipseLink 2.5.2 上运行良好,但移动到 2.6.0 会破坏 XmlValue 注释:

The property or field value cannot be annotated with XmlValue since it is a subclass of another XML-bound class.

基础 class 看起来像这样:

public abstract class Baseclass {

    @XmlAttribute
    private String baseValue;

    // ...
}

两个子class之一(复合模式,class B 可以有一个 BaseClass 元素列表):

@XmlRootElement(name = "A")
public class A extends BaseClass {

    @XmlValue
    private String aValue;

}

以及用法:

public class Root {

    @XmlElements({
            @XmlElement(class = A.class),
            @XmlElement(class = B.class)
    })
    private BaseClass object;

}

遗憾的是 class 布局无法更改,因为它是 JPA 持久保存到数据库中。我尝试用 XmlJavaTypeAdapter 包装 A 和 B classes 但没有成功。
是否可以像以前一样使用 EL 2.6 或通过适配器使用注释 class?

我设法使用 XmlAdapter 解决了这个问题。

在子类中替换 XmlValue 注解:

@XmlPath(".")
@XmlJavaTypeAdapter(AClassAdapter.class)
private String aValue;

和适配器实现:

public class AClassAdapter extends XmlAdapter<AdaptedValue, String> {

    public static class AdaptedValue {

        @XmlValue
        public String value;

        public AdaptedValue() {
        }

        public AdaptedValue(String value) {
            this.value = value;
        }
    }

    @Override
    public String unmarshal(AdaptedValue v) throws Exception {
        return v.value;
    }

    @Override
    public AdaptedValue marshal(String v) throws Exception {
        return new AdaptedValue(v);
    }
}

XmlPath(".") 成功了。没有它,编组的 XML 仍然具有包裹在 <aValue> 节点中的 aValue 的值。

就我而言,解决方案是按照此处的建议添加@XmlValueExtension(除了@XmlValue):https://bugs.eclipse.org/bugs/show_bug.cgi?id=461990