【问题标题】:JAXB-Eclipselink: Inherited propertiesJAXB-Eclipselink:继承的属性
【发布时间】:2012-01-05 07:51:26
【问题描述】:

我有以下使用 Eclipselink MOXy 2.3 将 POJO 编组为 XML 的用例:

public abstract class A {

    public abstract getX();

}

public class B extends A {

    private Foo x;

    @Override
    public Foo getX() {
        return this.x;
    }

}

public class C extends B {

    // Various fields and properties here

}

我需要编组 B 和 C,但不需要编组 A。 所以我将 A 设置为瞬态,这使得 B 继承其在编组 B 时将被编组的所有成员。 我不能将 B 设置为瞬态,因为我需要自己编组它,但是当我编组 C 时,我也需要对属性 B.getX() 进行编组。

除了@Override getX() 在 C 中还有什么方法可以对其进行编组?目前它只是我需要执行此操作的一个属性,但想象一个包含许多成员的大型 B 类,需要在 C 中 @Override 将它们与 C 编组在一起。

外部映射文件中是否有任何注释或可能性将超类中的属性标记为由其直接子类(或所有子类)继承?

到这里的 Eclipselink/JAXB 方式是什么?

问候,

【问题讨论】:

    标签: properties jaxb eclipselink moxy inherited


    【解决方案1】:

    没有什么特别需要做的:

    B

    我已根据您的previous questions 之一修改了B 类,以填充x 属性:

    package forum8739246;
    
    public class B extends A {
    
        private Foo x;
    
        public B() {
            x = new Foo();
        }
    
        public Foo getX() {
            return this.x;
        }
    
    }
    

    oxm.xml

    以下是我根据您的 cmets 对我的原始答案的元数据文件。

    <?xml version="1.0"?>
    <xml-bindings  
        xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
        version="2.3"
        package-name="forum8739246">
        <java-types>
            <java-type name="B" xml-accessor-type="FIELD">
                <java-attributes>
                    <xml-element java-attribute="x" name="X"/>
                </java-attributes>
            </java-type>
        </java-types>
    </xml-bindings>
    

    演示

    package forum8739246;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.xml.bind.*;
    import javax.xml.namespace.QName;
    
    import org.eclipse.persistence.jaxb.JAXBContextFactory;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            Map<String, Object> properties = new HashMap<String, Object>(1);
            properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum8739246/oxm.xml");
            JAXBContext jc = JAXBContext.newInstance(new Class[] {C.class},properties);
            System.out.println(jc.getClass());
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    
            JAXBElement<B> b = new JAXBElement<B>(new QName("b"), B.class, new B());
            marshaller.marshal(b, System.out);
    
            JAXBElement<C> c = new JAXBElement<C>(new QName("c"), C.class, new C());
            marshaller.marshal(c, System.out);
        }
    
    }
    

    输出

    从输出中可以看出,x 属性为BC 的两个实例编组:

    class org.eclipse.persistence.jaxb.JAXBContext
    <?xml version="1.0" encoding="UTF-8"?>
    <b>
       <X/>
    </b>
    <?xml version="1.0" encoding="UTF-8"?>
    <c>
       <X/>
    </c>
    

    【讨论】:

    • 嗯,是不是我在这里遇到了另一个与外部 xml 绑定相关的错误?对 B 类使用 oxm.xml 和访问器类型 FIELD,使用 编组“x”我得到:忽略类 [C] 上的属性 [x],因为没有为其生成属性。跨度>
    • 您看到的问题可能与以下错误(bugs.eclipse.org/367886)有关。我仍然无法重现您看到的问题。我已更新我的答案以反映我尝试过的最新代码。
    • Blaise,我遗漏了 A 中 getX() 的抽象声明,它在 B 中被覆盖。我想现在您应该能够重现此问题 - 请参阅我的第一篇文章以获取更新类声明...
    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2012-05-08
    • 2018-09-15
    相关资源
    最近更新 更多