我遇到过这样一种情况,JAXB拒绝解组XML元素,除非相应的Java字段有名称空间注释。这种行为仅始于JDK 1.8.0_111(也可能始于102)。JDK 1.8的早期版本可以工作。
测试案例:
Java类(缩写):
package my.package;
@XmlRootElement(name = "MyElement", namespace="myns")
public class MyElement {
@XmlElement(name = "subEl")
private String subEl;
}
XML:
<MyElement xmlns="myns">
<subEl>text1</subEl>
</MyElement>
package-info.java:
@XmlSchema(elementFormDefault = XmlNsForm.QUALIFIED)
package my.package;
取消编组代码:
JAXBContext jc = JAXBContext.newInstance(MyElement.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
MyElement myel = (MyElement) unmarshaller.unmarshal(xmlStream);
System.out.println("Parse result: "+ myel);
使用 JDK 1.8.0_101(及更早版本),可以打印以下内容:
分析结果:MyElement [subEl=subEl]
用JDK 1.8.0_111我得到:
解析结果:MyElement[subEl=null]
所以JDK 1.8.0_111拒绝解组元素“MyElement”。
如果我在字段注释上指定命名空间:
@XmlElement(name = "subEl", namespace="myns")
private String subEl;
它在所有JDK版本中按预期工作。
这是怎么回事?
据我所知,设置元素FormDefault = XmlNsForm.QUALIFIED
应该导致类MyElement的所有字段“继承”类的命名空间。Javadocs for @XmlElement
说:
如果值为“##default”,则命名空间确定如下:
如果封闭包具有XmlSchema注释,并且其elementFormDefault是限定的,则封闭类的命名空间。否则为“”(这将在默认命名空间中生成非限定元素。
默认:" # #默认"
那么,为什么JDK1.8.0_111不解组元素?
注意:JAXB错误报告#1087-使用elementForName=合格失败解组包装元素(以前在JAXB-1087-使用elementForName=合格失败解组包装元素)似乎报告了相同的问题-到目前为止没有响应。
我认为这是相关的错误 - https://bugs.openjdk.java.net/browse/JDK-8165299
从中我可以说JAXB确实有一个补丁。因此,这种以空值结束的奇怪行为是错误的JAXB映射,而不是Java中的回归。
这是我的包信息级别映射 这是我的输入xml(只是根元素) 您可以注意到URI“http://www.company.com/commons“使用不同的前缀映射。<br>解组工作正常,使用 在一些输入修改之后,我需要将文件持久化(使用原始的名称空间前缀)。 问题是:< br >在解组期间,有什么方法可以检索名称空间/前缀映射吗?
我有一个为安全令牌构建的XML。这些包含基于WS-Trust的名称空间,但是当我解组这个XML以创建< code > RequestSecurityTokenResponseCollection 对象时,它用< code>ns1 、< code>ns2 、< code>ns3等名称空间替换了这些名称空间。 是否有一种方法可以在不更改输入XML中的名称空间和名称空间前缀的情况下解组XML? 这是我一
我的代码如下: 我怎样才能让它工作?如果我的xml标记有一些相关元素,如上面的“xmlns”,则JAXB解组器会抛出异常。 这是我第一次这么做,所以我对JAXB、解编等都一无所知。我在苦苦挣扎任何帮助都是好的。 编辑StackTrace:
当我试图使用包含名称空间的JAXB将xml转换为Java对象时,会发生错误。 示例示例:' Zeta Walnes ` 我需要忽略名称空间
问题内容: 这是我的xml,需要将其转换为Java。我用过jaxb 并引发以下异常javax.xml.bind.UnmarshalException:意外元素(uri:“ http://www.ae.com/Event/Load ”,本地:“ Order”)。期望的元素是<{} lm:Order> 这是我的解组代码 订购Pojo班 您能否也帮助我阅读,当前正在读取文件,需要读取为XML Strin
我有一个xml,我正在尝试解体。它失败,因为它缺少必需的命名空间。 需要成为: 这个NamespaceFilter的例子只处理一个名称空间。我需要一个将追加两个名称空间。