将名称空间设置为@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]
如果我从@XmlRootElement
和xmlns=\"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
。