2017-09-26 19 views
0

@XmlElememtsを使用して、同じタイプのパラメータ間の選択肢を表すことは可能ですか?ベスト例で説明:私はidを受信したとき同じタイプの複数の@XmlElementメンバーを持つ@XmlElementsを使用する

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

ので、私はそれが犬や猫のかどうか知りたいのです。

ソリューション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> 
関連する問題