将名称空间设置为@XmlRootElement时,解组失败且没有错误

我创建了一个JAXB对象,我正在尝试将xml字符串解组到其中。 我面临的问题是,当我将namespace属性放在@XmlRootElement和我发送的xml文档中时, JAXB对象将被创建,但它是空的。 如果我删除命名空间它的工作原理。 所以这就是我的意思

我的JAXB对象:

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

我的主要:

 public static void main(String[] args) throws JAXBException { String s = "" + "Test Title from BAwrapper" + ""; 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()); } } 

输出:

 Incident [eventTitle=null] 

如果我从@XmlRootElementxmlns=\"http://www.ba.com/schema/BAserviceDeskAPI/incident\"删除了, namespace = "http://www.ba.com/schema/BAserviceDeskAPI/incident" xmlns=\"http://www.ba.com/schema/BAserviceDeskAPI/incident\"从发送的xml我得到下面的输出

Incident [eventTitle=Test Title from BAwrapper]

任何想法为什么会这样?

谢谢

@XmlRootElement指定的命名空间仅适用于该元素。 如果要将其应用于已映射到的所有元素,可以使用@XmlSchema批注在包级别执行此@XmlSchema

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; 

了解更多信息

我在博客上写了更多关于JAXB和命名空间限定的文章:


附加信息

将名称空间设置为@XmlRootElement时,解组失败且没有错误

对于JAXB,我们(JSR-222专家组)决定,如果存在未映射的内容,则默认情况下unmarshal不会失败。 为什么? 因为很多XML文档包含额外的内容,所以事情总是会失败。 如果您确实想要查看这些错误,则可以在Unmarshaller上指定ValidationEventHandler