2011-05-16 78 views
11

所以我希望有通過類似以下的JAXB @XmlElements擁有的minOccurs = 1

@XmlElements(
     { 
      @XmlElement(name = "Apple", type = Apple.class), 
      @XmlElement(name = "Orange", type = Orange.class), 
      @XmlElement(name = "Mango", type = Mango.class) 
     } 
) 
public List<Fruit> getEntries() { 
     return fruitList; 
} 

我想知道@XmlElements被標註是否有強制執行列表中包含至少一個方法列表1元,因爲現在的XSD看起來像

<xs:complexType name="fruitList"> 
    <xs:sequence> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element name="Apple" type="tns:apple"/> 
     <xs:element name="Orange" type="tns:orange"/> 
     <xs:element name="Mango" type="tns:mango"/> 
     </xs:choice> 
    </xs:sequence> 
    </xs:complexType> 
+0

你的意思是從Java代碼生成模式? – skaffman 2011-05-16 20:07:34

回答

3

假設蘋果,橘子,芒果,你可能要與@XmlElementRef相當於取代基的XML模式來註釋entries財產水果的子類,而比@XmlElements這對應於選擇的概念。

@XmlElementRef 
public List<Fruit> getEntries() { 
     return fruitList; 
} 

這假定蘋果,橘子,芒果類擴展了水果類,並與@XmlRootElement

@XmlRootElement 
public class Apple extends Fruit { 
    ... 
} 

被註釋更多信息

+4

這將如何幫助我強制執行列表中的至少一個元素? – denniss 2011-05-16 20:18:09

+0

@denniss - 你正確的看法是:@XmlElementRef也會產生'minOccurs =「0」'。我只是簡單地提供它作爲替代(更簡單)的財產映射,假設涉及繼承。 JAXB更專注於映射到XML而不是模式約束,因此可能沒有辦法獲得您之後的'minOccurs ='1''。您始終可以修改由JAXB生成的XML模式。 – 2011-05-16 20:41:01

13

我建議檢查:

@XmlElements(
    { 
     @XmlElement(name = "Apple", type = Apple.class, required = true), 
     @XmlElement(name = "Orange", type = Orange.class, required = true), 
     @XmlElement(name = "Mango", type = Mango.class, required = true) 
    } 
) 
+0

也在尋找問題的解決方案,並且這個技巧能夠解決問題。生成的XML省略了轉換爲默認值(= 1)的'minOccurs'屬性。 – user268396 2012-03-24 00:40:40