2012-09-20 30 views
3

我從它的架構服務器接收XML中規定幾乎每一個元素:轉換零=「true」以空解組操作

<xs:element name="myStringElementName" type="xs:string" nillable="true" minOccurs="0"/> 
<xs:element name="myIntElementName" type="xs:int" nillable="true" minOccurs="0"/> 

我試圖找到一個乾淨的方式,以每一個元素是轉換當它被解組到JAXB對象中時,我收到它被標記爲xsi:nil="true"爲null。因此,像這樣:

<myIntElementName xsi:nil="true" /> 

應導致在具有myIntElementName屬性爲NULL值,而不是一個零屬性設置爲true(或任何東西沿着這些線路)一個JAXBElement對象我的JAXB對象。我無法控制發送使用nillable屬性的XML的系統,所以我需要在收到它時將其轉換爲我的結尾。

回答

4

@XmlElement(的nillable =真)

你只需要在你的字段/屬性指定@XmlElement(nillable=true)得到這個行爲:

@XmlElement(nillable=true) 
private String foo; 

生成從XML模式

下面我將演示如何生成此映射從XML模式開始。

XML架構(schema.xsd)

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="foo"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="myStringElementName" type="xs:string" 
        nillable="true" minOccurs="0" /> 
       <xs:element name="myIntElementName" type="xs:int" 
        nillable="true" minOccurs="0" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

爲什麼你JAXBElement

在模型生成JAXBElement類型的屬性類型的屬性,因爲你有一個nillable元素,這是minOccurs="0"JAXBElement的使用允許模型區分缺少的元素(屬性爲null)和存在與nil="true"(帶有nil標誌的JAXBElement)的元素。

<xs:element name="myStringElementName" type="xs:string" 
         nillable="true" minOccurs="0" /> 

外部綁定文件(binding.xml)

外部綁定文件可以被指定來告訴JAXB實現不產生JAXBElement類型的任何屬性。請注意,這將使JAXB無法繞過所有XML文檔。

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings version="2.0" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"> 
    <jaxb:bindings> 
     <jaxb:globalBindings generateElementProperty="false"/> 
    </jaxb:bindings> 
</jaxb:bindings> 

XJC呼叫

下面是如何從XJC呼叫

xjc -b binding.xml schema.xsd 

生成的模型(美孚)利用一個外部綁定文件的示例

生成的模型看起來像下面:

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "myStringElementName", 
    "myIntElementName" 
}) 
@XmlRootElement(name = "foo") 
public class Foo { 

    @XmlElement(nillable = true) 
    protected String myStringElementName; 
    @XmlElement(nillable = true) 
    protected Integer myIntElementName; 

    public String getMyStringElementName() { 
     return myStringElementName; 
    } 

    public void setMyStringElementName(String value) { 
     this.myStringElementName = value; 
    } 

    public Integer getMyIntElementName() { 
     return myIntElementName; 
    } 

    public void setMyIntElementName(Integer value) { 
     this.myIntElementName = value; 
    } 

} 

更多信息

+1

有沒有人告訴過你最近說你真棒?還有一個問題,如果你不介意。我是否應該總是在我的JAXB類中註釋該屬性,而不是關聯的getter/setter方法? –

+0

註解吸氣(或二載)通常是最安全的事情。例如,如果您對JAXB和JPA使用相同的模型,那麼JPA實現會修改字節代碼以支持調用getter時觸發的延遲加載。欲瞭解更多信息,請參閱:http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html –