简体   繁体   中英

Unmarshalling fails with no errors when setting namespace to @XmlRootElement

I have created a JAXB object and I am trying to unmarshal an xml string into it. The problem that I am facing is that when I put the namespace property in the @XmlRootElement and in the xml document that I am sending, the JAXB object is getting created but it is empty. If I remove the namespace it works. So here is what I mean

My JAXB Object:

@XmlRootElement(name = "incident", namespace = "http://www.ba.com/schema/BAserviceDeskAPI/incident")
@XmlAccessorType(XmlAccessType.FIELD)
public class Incident {

    @XmlElement
    private String eventTitle;

    public Incident() {
    }

    public String getEventTitle() {
        return eventTitle;
    }

    public void setEventTitle(String eventTitle) {
        this.eventTitle = eventTitle;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Incident [");
        builder.append("eventTitle=");
        builder.append(eventTitle);
        builder.append("]");
        return builder.toString();
    }
}

My Main:

public static void main(String[] args) throws JAXBException {
        String s = "<incident xmlns=\"http://www.ba.com/schema/BAserviceDeskAPI/incident\">"
                + "<eventTitle>Test Title from BAwrapper</eventTitle>"
                + "</incident>";
        JAXBContext jaxbContext = JAXBContext.newInstance(Incident.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        Incident incident = (Incident) jaxbUnmarshaller.unmarshal(new ByteArrayInputStream(s.getBytes(StandardCharsets.UTF_8)));

        System.out.println(incident.toString());
    }
}

Output:

Incident [eventTitle=null]

If I remove the , namespace = "http://www.ba.com/schema/BAserviceDeskAPI/incident" from the @XmlRootElement and the xmlns=\\"http://www.ba.com/schema/BAserviceDeskAPI/incident\\" from the xml sent I get the output below

Incident [eventTitle=Test Title from BAwrapper]

Any ideas why this happens?

Thanks

The namespace specified on @XmlRootElement only applies to that element. If you want it to apply to all the elements you have mapped to, you can do it at the package level using the @XmlSchema annotation.

package-info.java

@XmlSchema( 
    namespace = "http://www.ba.com/schema/BAserviceDeskAPI/incident", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package example;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

For More Information

I have written more about JAXB and namespace qualification on my blog:


Additional Info

Unmarshalling fails with no errors when setting namespace to @XmlRootElement

For JAXB we (the JSR-222 expert group) decided that an unmarshal shouldn't fail by default if there is unmapped content. Why? Because alot of XML documents contain extra content and things would be failing all the time. If you do want to see these errors then you can specify a ValidationEventHandler on the Unmarshaller .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM