Jaxb Marshaller siempre escribe xsi: nil (incluso cuando @xmlelement (requerido = falso, nillable = true)))

StackOverflow https://stackoverflow.com/questions/5897785

  •  29-10-2019
  •  | 
  •  

Pregunta

Tengo una propiedad de Java anotada con @XmlElement(required=false, nillable=true). Cuando el objeto se shalled a XML, siempre se genera con el xsi:nil="true" atributo.

¿Hay una opción JaxbContext/Marshaller para dirigir al Marshaller que no escriba el elemento, en lugar de escribirlo con xsi:nil?

Busqué respuestas a esto y también eché un vistazo al código, Afaics, siempre escribirá xsi:nil si nillable = true. ¿Me estoy perdiendo de algo?

¿Fue útil?

Solución

Si la propiedad se anota con @XmlElement(required=false, nillable=true) y el valor es nulo, se escribirá con xsi:nil="true".

Si lo anotas con solo @XmlElement Obtendrá el comportamiento que está buscando.

import javax.xml.bind.annotation.xmlaccesstype; import javax.xml.bind.annotation.xmlaccessortype; import javax.xml.bind.annotation.xmlelement; import javax.xml.bind.annotation.xmlrootelement;

Ejemplo

Dada la siguiente clase:

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

}

Y este código de demostración:

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

}

El resultado será:

<?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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top