2017-09-26 32 views
0

是否有可能多@XmlElement成員都使用@XmlElememts來表示同一類型的參數之間進行選擇。最好用一個例子解釋:使用@XmlElements與同類型

@XmlElements({ 
    @XmlElement(name="dogId", type=Long.class), 
    @XmlElement(name="catId", type=Long.class)}) 
private Long animalId; 

所以,當我收到id,我想知道它是否是一個狗或貓。

解決方案1是:

@XmlElement 
private Long dogId; 

@XmlElement 
private Long catId; 

儘管這是一個顯而易見的解決方案,在那裏我手動必須檢查只是其中的一個設置,在我來說,我真的很喜歡單個XML的使用領域。

那會是一個很好的解決方案呢?

@XmlElements({ 
    @XmlElement(name="dogId", type=CatId.class), 
    @XmlElement(name="catId", type=DogId.class)}) 
private Long animalId; 

public class DogId extends BigInteger { 
    ... 
} 

public class CatId extends BigInteger { 
    ... 
} 

是否有針對此問題的標準解決方案?

回答

0

或本當你想知道你的動物,就必然會發生的其他屬性有時

@XmlElements({ 
    @XmlElement(name="dog", type=Dog.class), 
    @XmlElement(name="cat", type=Cat.class)}) 
private List<Animal> animals; 

public class Animal { 
    // common animal properties 
    BigInteger id; 
} 

public class Dog extends Animal { 
    // dog specific properties 
} 

public class Cat extends Animal { 
    // cat specific properties 
} 
0

我用以下解決方案:

@XmlElementRefs({ 
    @XmlElementRefs(name="dogId", namespace = "animals.com", type = JAXBElement.class), 
    @XmlElementRefs(name="catId", namespace = "animals.com", type = JAXBElement.class)}) 
private JAXBElement<Long> animalId; 

然後你還需要一個ObjectFactory

@XmlRegistry 
public class ObjectFactory { 

    private final static QName CAT_ID_QNAME = new QName("animals.com", "catId"); 
    private final static QName DOG_ID_QNAME = new QName("animals.com", "dogId"); 

    public ObjectFactory() { 
    } 

    @XmlElementDecl(namespace = "animals.com", name = "catId", scope = AnimalsRequestXML.class) 
    public JAXBElement<Long> createCatId(final Long value) { 
     return new JAXBElement<>(CAT_ID_QNAME, Long.class, AnimalsRequestXML.class, value); 
    } 
    @XmlElementDecl(namespace = "animals.com", name = "dogId", scope = AnimalsRequestXML.class) 
    public JAXBElement<Long> createDogId(final Long value) { 
     return new JAXBElement<>(DOG_ID_QNAME, Long.class, AnimalsRequestXML.class, value); 
    } 

這產生了一個xs:choice

 <xs:choice> 
     <xs:element name="catId" type="xs:long"/> 
     <xs:element name="dogId" type="xs:long"/> 
     </xs:choice>