How to create XmlElement with no value with JAXB

923 Views Asked by At

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 ?

1

There are 1 best solutions below

4
On BEST ANSWER

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