2012-11-28 35 views
2

我的模型對象是這個樣子:如何使用JAXB生成帶有可選的xs:元素的XSD?

@XmlRootElement(name = "appConfig") 
@XmlType(propOrder = {}) 
public class Config implements Serializable { 
... 
private int advancedFooBar; 
... 
@XmlElement(name = "advancedfoobar") 
public int getAdvancedFooBar() { 
    return advancedFooBar; 
} 

public void setAdvancedFooBar(int advancedFooBar) { 
    this.advancedFooBar = advancedFooBar ; 
} 

當我產生對這一類的模式瓦特/ JXC我結束了對上述財產的下列內容:

<xs:element name="advancedfoobar" type="xs:int"/> 

我想這是一個可選的元素,所以我試圖改變

@XmlElement(name = "advancedfoobar") 

@XmlElement(name = "advancedfoobar", required=false) 

但是,這並沒有對生成的模式產生任何改變。我需要做什麼以使「advancedfoobar」元素在生成的模式中被定義爲可選的?

我在Windows 7 Ultimate x64上使用JDK 1.7.0_U3。

謝謝。

-Noah

回答

4

WHAT的Javadoc SAY

據的Javadoc @XmlElement(參見:http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlElement.html#required%28%29

如果需要()是假,那麼JavaBean屬性被映射到XML 使用minOccurs =「0」的模式元素聲明。 maxOccurs對於單值屬性爲「1」,對於多值屬性爲「無限」。

advancedfoobar架構定義應該是minOccurs=0以下映射:

@XmlElement(name = "advancedfoobar") 
public int getAdvancedFooBar() { 
    return advancedFooBar; 
} 

@XmlElement(name = "advancedfoobar", required=false) 
public int getAdvancedFooBar() { 
    return advancedFooBar; 
} 

臭蟲在莫西和參考實現

關於原語和可選元素,在EclipseLink JAXB (MOXy)和JAXB參考實現中似乎都存在缺陷。我對MOXY打開了以下錯誤。


替代方法

您可以Integer類型,而不是int的財產。或者更好,只需將@XmlElement註釋中的type屬性設置爲Integer即可。任何能夠保存null值的類型默認都是可選的。

配置

package forum13595629; 

import java.io.Serializable; 
import javax.xml.bind.annotation.*; 

@XmlRootElement(name = "appConfig") 
@XmlType(propOrder = {}) 
public class Config implements Serializable { 

    private int advancedFooBar; 

    @XmlElement(name = "advancedfoobar", type=Integer.class) 
    public int getAdvancedFooBar() { 
     return advancedFooBar; 
    } 

    public void setAdvancedFooBar(int advancedFooBar) { 
     this.advancedFooBar = advancedFooBar; 
    } 

} 

演示

package forum13595629; 

import java.io.IOException; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.SchemaOutputResolver; 
import javax.xml.transform.Result; 
import javax.xml.transform.stream.StreamResult; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Config.class); 

     jc.generateSchema(new SchemaOutputResolver() { 

      @Override 
      public Result createOutput(String namespaceUri, 
        String suggestedFileName) throws IOException { 
       StreamResult result = new StreamResult(System.out); 
       result.setSystemId(suggestedFileName); 
       return result; 
      } 

     }); 

    } 

} 

輸出

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:complexType name="config"> 
     <xsd:all> 
     <xsd:element name="advancedfoobar" type="xsd:int" minOccurs="0"/> 
     </xsd:all> 
    </xsd:complexType> 
    <xsd:element name="appConfig" type="config"/> 
</xsd:schema> 
+0

@Blaze:好吧,我想試試。我注意到,我似乎自動是可選的字符串類型,我想知道int是什麼特別。對我來說,模式gen不使用@XMLElement(必需)來判斷原語是很奇怪的。 – NBW

+0

@NBW - 這似乎是一個錯誤。我已經用更多信息更新了我的答案。我領導EclipseLink JAXB(MOXy)實現,併爲此問題提出了一個錯誤。這在JAXB RI中似乎也存在問題,我建議你輸入一個針對該impl的錯誤:http://jaxb.java.net –

+0

@NBW - 我用更好的解決方案更新了我的答案。 –

相關問題