2014-05-09 26 views
0

在下面的代碼被生成以下給出的XML與出xsi:nil=true,爲什麼它不生成該屬性?從下面的演示代碼JAXB marshelling預期的xsi:無=「真」,在元件當該值爲小數,這將是空的,但的xsi:無=「真」不打算來

XML出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <Market> 
     <detail> 
      <shipping available="false"/> 
     </detail> 
    </Market> 

用於產生從marshelling輸出的XML JAXB類,我還增加了@XmlElement(nillable = true)註釋。它不是在XML outputing的xsi:nil=true

package com.jverstry.annotations.generics; 

import java.math.BigDecimal; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "detail" 
}) 
@XmlRootElement(name = "Market") 
public class Market { 

    @XmlElement(required = false) 
    protected Detail detail; 

    public Detail getDetail() { 
     return detail; 
    } 

    public void setDetail(Detail detail) { 
     this.detail = detail; 
    } 

    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { "shipping"}) 
    public static class Detail { 

     @XmlElementRef(name="shipping") 
     protected JAXBElement<Shipping> shipping; 

     public JAXBElement<Shipping> getShipping() { 
      return shipping; 
     } 

     public void setShipping(JAXBElement<Shipping> value) { 
      this.shipping = value; 
     } 


     @XmlAccessorType(XmlAccessType.FIELD) 
     @XmlType(name = "", propOrder = { "value" }) 
     public static class Shipping { 

      @XmlValue 
      protected BigDecimal value; 

      @XmlAttribute(name = "available") 
      protected Boolean available; 

      public BigDecimal getValue() { 
       return value; 
      } 

      public void setValue(BigDecimal value) { 
       this.value = value; 
      } 

      public Boolean getAvailable() { 
       return available; 
      } 

      public void setAvailable(Boolean value) { 
       this.available = value; 
      } 
     } 
    } 
} 

ObjectFactory類:

package com.jverstry.annotations.generics; 

import javax.xml.bind.JAXBElement; 
import javax.xml.bind.annotation.XmlElementDecl; 
import javax.xml.bind.annotation.XmlRegistry; 
import javax.xml.namespace.QName; 

@XmlRegistry 
public class ObjectFactory { 

    @XmlElementDecl(name = "shipping") 
    public JAXBElement<Market.Detail.Shipping> createShipping(Market.Detail.Shipping value) { 
     return new JAXBElement<Market.Detail.Shipping>(new QName("shipping"), Market.Detail.Shipping.class, value); 
    } 
} 

運行JAXB類用於獲取XML:

package com.jverstry.annotations.generics; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.Marshaller; 

public class Demo { 

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

     Market market = new Market(); 
     Market.Detail md = new Market.Detail(); 

     Market.Detail.Shipping mds = new Market.Detail.Shipping(); 
     mds.setAvailable(false); 
     JAXBElement<Market.Detail.Shipping> shipping = new ObjectFactory().createShipping(mds); 

     md.setShipping(shipping); 
     market.setDetail(md); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(market, System.out); 
    } 
} 

回答

1

xsi:nil="true"存在將表示一個Market.Detail對象其shipping財產是null。這裏不是這種情況 - 你有一個空值的非空Market.Detail.Shipping對象。爲了讓xsi:nil與其他屬性的組合,你不得不在shipping財產申報作爲的JAXBElement<Shipping>而不只是Shipping

@XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { "shipping"}) 
    public static class Detail 
    { 

     @XmlElement(nillable = true) 
     protected JAXBElement<Market.Detail.Shipping> shipping; 

     public JAXBElement<Market.Detail.Shipping> getShipping() { 
      return shipping; 
     } 

     public void setShipping(JAXBElement<Market.Detail.Shipping> value) { 
      this.shipping= value; 
     } 


     @XmlAccessorType(XmlAccessType.FIELD) 
     @XmlType(name = "", propOrder = { "value" }) 
     public static class Shipping 
     { 
      // as before 
     } 
    } 

現在<shipping available="false" xsi:nil="true"/>將由JAXBElementisNil()回報true,其getValue()表示是Shipping的非空實例,其getAvailable()返回false


追隨你的最新修改的問題 - 現在你有基礎設施,以創造JAXBElement<Shipping>情況下,您只需設置nil屬性要求:

Market.Detail.Shipping mds = new Market.Detail.Shipping(); 
    mds.setAvailable(false); 
    JAXBElement<Market.Detail.Shipping> shipping = new ObjectFactory().createShipping(mds); 
    shipping.setNil(true); // mark the element as nil 

    md.setShipping(shipping); 
相關問題