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"/>