【问题标题】:Implement " xml-elements" using MOXy使用 MOXy 实现“xml-elements”
【发布时间】:2011-03-15 13:54:36
【问题描述】:


我想知道如何使用 EclipseLink MOXy 实现具有接口类型列表,
之前,使用 JAXB ,以下注释完成了这项工作

class A {

   @XmlElements({
       @XmlElement(name = "B1", type = B1.class),
       @XmlElement(name = "B2", type = B2.class)
    })
    List< B > list;

}

interface B{}

class B1 implements B {}

class B2 implements B {} 

支持接口类型列表???

【问题讨论】:

    标签: jaxb eclipselink moxy


    【解决方案1】:

    我领导EclipseLink JAXB (MOXy)。我无法重现您的问题。你能提供你看到的堆栈跟踪吗?以下是我尝试过的:

    演示

    import java.io.File;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBElement;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.Unmarshaller;
    import javax.xml.transform.stream.StreamSource;
    
    import org.eclipse.persistence.Version;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            System.out.println(Version.getVersionString());
    
            JAXBContext jc = JAXBContext.newInstance(A.class, B1.class, B2.class);
            System.out.println(jc);
    
            File xml = new File("input.xml");
            Unmarshaller unmarshaller = jc.createUnmarshaller();
            JAXBElement<A> root = unmarshaller.unmarshal(new StreamSource(xml), A.class);
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(root, System.out);
        }
    
    }
    

    jaxb.properties

    javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
    

    input.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
       <B1/>
       <B2/>
    </root>
    

    输出

    2.2.0.v20110202-r8913
    org.eclipse.persistence.jaxb.JAXBContext@11ddcde
    <?xml version="1.0" encoding="UTF-8"?>
    <root>
       <B1/>
       <B2/>
    </root>
    

    使用 EclipseLink JAXB (MOXy) 的 XML 元数据文件

    MOXy 还具有将元数据作为 XML 文件提供的扩展。下面是这个例子的样子:

    <?xml version="1.0"?>
    <xml-bindings
        xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
        package-name="com.example">
        <java-types>
            <java-type name="A">
                <java-attributes>
                    <xml-elements java-attribute="list">
                        <xml-element name="B1" type="com.example.B1"/>
                        <xml-element name="B2" type="com.example.B2"/>
                    </xml-elements>
                </java-attributes>
            </java-type>
        </java-types>
    </xml-bindings>
    

    这个元数据文件在创建 JAXBContext 时作为属性传入:

    Map<String, Object> properties = new HashMap<String, Object>(1);
    properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, new File("src/forum149/bindings.xml"));
    JAXBContext jc = JAXBContext.newInstance(new Class[] {A.class, B1.class, B2.class}, properties);
    

    欲了解更多信息,请参阅:

    【讨论】:

    • 在上面提供的示例中,我能够使用 XmlElements 注释来编组/解组包含接口类型列表的对象。但我不知道如何创建一个可以做同样事情的绑定 XML。我正在尝试使用 MoXy 的映射文件而不是使用注解(例如这里提到的 binding.xml bdoughan.blogspot.com/2010/12/…)。假设 PhoneNumber 类是一个具有两个实现类(例如:XPhoneNumber、YPhoneNumber)的接口,这将如何在绑定 xml 中进行描述?
    • @RO86 - 我已更新我的答案以包含 MOXy 映射文件。它假定模型类在“com.example”包中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多