Search code examples
javaxmljaxbxmlelement

How to create XmlElement with no value with JAXB


Would like to create the following XML element using JAXB, no value(content), no closing element name, just closing '/' :

 <ElementName attribute1="A" attribute2="B"" xsi:type="type" xmlns="some_namespace"/> 

Trying the following

@XmlAccessorType(XmlAccessType.FIELD)                                  

public class ElementName {
@XmlElement(name = "ElementName", nillable = true)
protected String value;
@XmlAttribute(name = "attribute1")
protected String attribute1;
@XmlAttribute(name = "attribute2")
protected String attribute2;
}

When constructing an object of this type as below, there is an exception

ElementName element = new ElementName();

What is the correct way of doing it ?


Solution

  • In case you want to achieve it for ElementName with value set to null remove nillable attribute. Simple example how to generate XML payload:

    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    
    public class JaxbApp {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jaxbContext = JAXBContext.newInstance(ElementName.class);
    
            ElementName en = new ElementName();
            en.attribute1 = "A";
            en.attribute2 = "B";
            en.value = null;
    
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.marshal(en, System.out);
        }
    }
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name = "ElementName")
    class ElementName {
    
        @XmlElement(name = "ElementName")
        protected String value;
        @XmlAttribute(name = "attribute1")
        protected String attribute1;
        @XmlAttribute(name = "attribute2")
        protected String attribute2;
    }
    

    prints:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?><ElementName attribute1="A" attribute2="B"/>