【问题标题】:require either one element or the other in JAXB在 JAXB 中需要一个元素或另一个元素
【发布时间】:2014-03-19 10:00:53
【问题描述】:

我有一个这样的带有 JAXB 注释的 POJO:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Clazz implements Serializable {

    @XmlElement(required = false)
    private int a;

    @XmlElement(required = false)
    private int b;
}

我想标记字段 a 或字段 b 是必需的。根据我目前的设置,它们都不是必需的,但我希望其中一个出现,而不是另一个。我怎样才能实现它?

【问题讨论】:

    标签: java jaxb xml-serialization xml-deserialization


    【解决方案1】:

    您可以使用@XmlElementRefs 执行以下操作

    领域模型

    Clazz

    import java.io.Serializable;
    import javax.xml.bind.JAXBElement;
    import javax.xml.bind.annotation.*;
    
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Clazz implements Serializable {
    
        @XmlElementRefs({
            @XmlElementRef(name="a", type=JAXBElement.class),
            @XmlElementRef(name="b", type=JAXBElement.class)
        })
        private JAXBElement<Integer> aOrB;
    
    }
    

    对象工厂

    import javax.xml.bind.JAXBElement;
    import javax.xml.bind.annotation.*;
    import javax.xml.namespace.QName;
    
    @XmlRegistry
    public class ObjectFactory {
    
        @XmlElementDecl(name = "a")
        public JAXBElement<Integer> createA(Integer integer) {
            return new JAXBElement<Integer>(new QName("a"), Integer.class, integer);
        }
    
    
        @XmlElementDecl(name = "b")
        public JAXBElement<Integer> createB(Integer integer) {
            return new JAXBElement<Integer>(new QName("b"), Integer.class, integer);
        }
    
    }
    

    演示代码

    演示

    import java.io.File;
    import javax.xml.bind.*;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Clazz.class, ObjectFactory.class);
    
            Unmarshaller unmarshaller = jc.createUnmarshaller();
            File xml = new File("src/forum22502171/input.xml");
            Clazz clazz = (Clazz) unmarshaller.unmarshal(xml);
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(clazz, System.out);
        }
    
    }
    

    input.xml/Output

    <?xml version="1.0" encoding="UTF-8"?>
    <clazz>
        <b>123</b>
    </clazz>
    

    【讨论】:

    • 很好的答案,谢谢。如果字段类型不同,是否会应用相同的解决方案?也许与JAXBElement&lt;Object&gt; 或任何共同的祖先?
    • @logoff - 如果类型不同,事情就更容易了。可以使用@XmlElements注解,不需要使用JAXBElementblog.bdoughan.com/2010/10/jaxb-and-xsd-choice-xmlelements.html
    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多