Search code examples
jaxbmarshallingxml-nil

Jaxb marshaller always writes xsi:nil (even when @XmlElement(required=false, nillable=true))


I have a java property annotated with @XmlElement(required=false, nillable=true). When the object is marshalled to xml, it is always outputted with the xsi:nil="true" attribute.

Is there a jaxbcontext/marshaller option to direct the marshaller not to write the element, rather than write it with xsi:nil?

I've looked for answers to this and also had a look at the code, afaics, it will always write xsi:nil if nillable = true. Am I missing something?


Solution

  • If the property is annotated with @XmlElement(required=false, nillable=true) and the value is null it will be written out with xsi:nil="true".

    If you annotate it with just @XmlElement you will get the behaviour you are looking for.

    import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement;

    Example

    Given the following class:

    @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;
    
    }
    

    And this demo code:

    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);
        }
    
    }
    

    The result will be:

    <?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>