在JAXB中需要一个元素或另一个元素

我有一个这样的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 。 根据我目前的设置,它们都不是必需的,但我希望其中一个存在而不是另一个。 我怎么能实现它?

您可以使用@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 aOrB; } 

的ObjectFactory

 import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.*; import javax.xml.namespace.QName; @XmlRegistry public class ObjectFactory { @XmlElementDecl(name = "a") public JAXBElement createA(Integer integer) { return new JAXBElement(new QName("a"), Integer.class, integer); } @XmlElementDecl(name = "b") public JAXBElement createB(Integer integer) { return new JAXBElement(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中/输出

   123