当前位置: 首页 > 知识库问答 >
问题:

JAXB:在JDK 1中解组-回归期间未继承命名空间注释。8_102?

申屠恺
2023-03-14

我遇到过这样一种情况,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=合格失败解组包装元素)似乎报告了相同的问题-到目前为止没有响应。

共有1个答案

谷梁博易
2023-03-14

我认为这是相关的错误 - 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的例子只处理一个名称空间。我需要一个将追加两个名称空间。