在子类中使用@XmlValue

时间:2015-09-17 08:31:44

标签: jaxb eclipselink moxy

我使用EclipseLink 2.5.2可以正常使用此代码,但是转移到2.6.0会破坏XmlValue注释:

  

属性或字段值不能使用XmlValue注释,因为它是另一个XML绑定类的子类。

基类看起来像这样:

public abstract class Baseclass {

    @XmlAttribute
    private String baseValue;

    // ...
}

两个子类中的一个(复合模式,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;

}

不幸的是,类布局无法更改,因为它是JPA持久化到数据库。我试图用XmlJavaTypeAdapter包裹A和B类但没有成功 是否可以像以前一样使用EL 2.6或通过适配器类?

2 个答案:

答案 0 :(得分:3)

我设法使用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>个节点中的值。

答案 1 :(得分:0)

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