Java Jaxb预期xsi:nil=";“真的”;在元素中,当值为十进制时,该值将为null,但xsi:nil=";“真的”;他不来了

Java Jaxb预期xsi:nil=";“真的”;在元素中,当值为十进制时,该值将为null,但xsi:nil=";“真的”;他不来了,java,xml,jaxb,Java,Xml,Jaxb,下面的代码正在生成下面给出的xml,但不包含outxsi:nil=true,为什么不生成该属性 XML从下面的演示代码中导出: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Market> <detail> <shipping available="false"/> </detail> </Marke

下面的代码正在生成下面给出的xml,但不包含out
xsi:nil=true
,为什么不生成该属性

XML从下面的演示代码中导出:

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <Market>
      <detail>
          <shipping available="false"/>
       </detail>
   </Market>
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);
    }
}
package com.jverstry.annotations.generics;
导入javax.xml.bind.JAXBElement;
导入javax.xml.bind.annotation.xmlementdecl;
导入javax.xml.bind.annotation.XmlRegistry;
导入javax.xml.namespace.QName;
@XmlRegistry
公共类对象工厂{
@xmlementdecl(name=“shipping”)
公共JAXBElement createShipping(Market.Detail.Shipping value){
返回新的JAXBElement(新的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);
    }
}
package com.jverstry.annotations.generics;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.JAXBElement;
导入javax.xml.bind.Marshaller;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(Market.class,ObjectFactory.class);
市场=新市场();
Market.Detail md=新市场.Detail();
Market.Detail.Shipping mds=新市场.Detail.Shipping();
mds.setAvailable(false);
JAXBElement shipping=new ObjectFactory().createShipping(mds);
md.setShipping(运输);
市场详情(md);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
马歇尔(市场、系统、输出);
}
}

出现
xsi:nil=“true”
将表示
市场。详细信息
配送属性为
空的对象。这里的情况并非如此-您有一个非空的
Market.Detail.Shipping
对象,其值为空。为了允许
xsi:nil
与其他属性结合使用,您必须将
shipping
属性声明为
JAXBElement
,而不仅仅是
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
        }
    }
    @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
        }
    }
    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);