Java Jaxb预期xsi:nil=";“真的”;在元素中,当值为十进制时,该值将为null,但xsi:nil=";“真的”;他不来了
下面的代码正在生成下面给出的xml,但不包含outJava 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
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);