【问题标题】:Jaxb marshaller always writes xsi:nil (even when @XmlElement(required=false, nillable=true))Jaxb marshaller 总是写 xsi:nil(即使 @XmlElement(required=false, nillable=true))
【发布时间】:2011-05-05 12:39:07
【问题描述】:

我有一个用@XmlElement(required=false, nillable=true) 注释的java 属性。将对象编组为 xml 时,始终以 xsi:nil="true" 属性输出。

是否有一个 jaxbcontext/marshaller 选项来指示编组器不要写入元素,而不是使用xsi:nil 编写它?

我一直在寻找这个问题的答案,还查看了代码,afaics,如果nillable = true,它总是会写成xsi:nil。我错过了什么吗?

【问题讨论】:

    标签: jaxb marshalling xml-nil


    【解决方案1】:

    如果属性用@XmlElement(required=false, nillable=true)注解并且值为null,它将用xsi:nil="true"写出。

    如果您仅使用 @XmlElement 对其进行注释,您将获得您正在寻找的行为。

    导入 javax.xml.bind.annotation.XmlAccessType; 导入 javax.xml.bind.annotation.XmlAccessorType; 导入 javax.xml.bind.annotation.XmlElement; 导入 javax.xml.bind.annotation.XmlRootElement;

    示例

    给定以下类:

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Root {
    
        @XmlElement(nillable=true, required=true)
        private String elementNillableRequired;
    
        @XmlElement(nillable=true)
        private String elementNillbable;
    
        @XmlElement(required=true)
        private String elementRequired;
    
        @XmlElement
        private String element;
    
    }
    

    还有这个演示代码:

    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.Marshaller;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Root.class);
    
            Root root = new Root();
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    
            marshaller.marshal(root, System.out);
        }
    
    }
    

    结果将是:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <root>
        <elementNillableRequired xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
        <elementNillbable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    </root>
    

    【讨论】:

    • 谢谢,这也是我在代码中看到的。我不想更改注释,因为它是生成的代码,也因为它是 xml 模式的准确反映(将元素定义为 minoccurs='0' 和 nillable='true')。
    • FWIW,@XmlElement(required=false) 似乎也产生了所需的行为。
    • Hrmmm ...我知道这很旧,但是 elementRequired 为 null 实际上应该抛出一个错误(对吗?)...因为它的 null 仍然是必需的。在我的例子中,我们使用的是 cxf / SOAP。
    • 我尝试扩展您的示例,其中 elementNillableRequired 元素具有属性,然后它不起作用。它创建无效元素。我只是设置了属性并让值为空: (nillable is missing)
    • @hudi - 我会看看你发布的相应问题:stackoverflow.com/questions/28537873/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2011-02-09
    • 1970-01-01
    • 2022-06-28
    相关资源
    最近更新 更多