为什么jaxb记录的属性com.sun.xml.bind.xmlHeaders无法识别,但“内部”属性呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么jaxb记录的属性com.sun.xml.bind.xmlHeaders无法识别,但“内部”属性呢?相关的知识,希望对你有一定的参考价值。

我对documentation of JAXB 2.2.11感到困惑,其中该属性被描述为com.sun.xml.bind.xmlHeaders,但当我尝试使用它时,我得到了javax.xml.bind.PropertyException: name: com.sun.xml.bind.xmlHeaders

我发现com.sun.xml.internal.bind.xmlHeaders虽然有效。

所以我的问题实际上是关于这个的基本原理,我是否在查看错误的文档? “内部”来自哪里?

public static void main(String[] args) throws JAXBException {
    MyElement myxml = new MyElement();
    JAXBContext context = JAXBContext.newInstance(MyElement.class);
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

    marshaller.setProperty("com.sun.xml.bind.xmlHeaders","");
    //marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders","<DOCTYPE>");



    marshaller.marshal(myxml, System.out);
}
答案

确保JAXB的正确实现在类路径上。显然有几个“参考实现”可供选择,除了JDK附带的一个。

  • 物业:com.sun.xml.internal.bind.xmlHeaders JDK 8版 javax.xml.bind:jaxb-api:2.2.11
  • 物业:com.sun.xml.bind.xmlHeaders org.glassfish.jaxb:jaxb-runtime:2.2.11 com.sun.xmlbind:jaxb-core:2.2.11加上com.sun.xmlbind:jaxb-impl:2.2.11

如果您正在使用maven,那么:

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.2.11</version>
</dependency>

带来一个支持com.sun.xml.bind.xmlHeaders的版本(没有内部)。

或者,如果您使用:

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.2.11</version>
</dependency>

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.11</version>
</dependency>

你也得到com.sun.xml.bind.xmlHeaders。但如果你使用

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2.11</version>
</dependency>

你只能得到com.sun.xml.internal.bind.xmlHeaders

所有这些都是JAXB 2.2.11,但是来自不同的供应商/提供商,所以它们在支持的marshaller属性方面有所不同(因为它们中的一些实际上不是JAXB规范的一部分)。

以上是关于为什么jaxb记录的属性com.sun.xml.bind.xmlHeaders无法识别,但“内部”属性呢?的主要内容,如果未能解决你的问题,请参考以下文章

JAXB - 属性“值”已定义。使用 <jaxb:property> 解决此冲突

JAXB 可以创建“只读”类属性吗?

使用 JAXB 的具有属性和内容的 XML 元素

Java/JAXB:根据属性将 Xml 解组为特定子类

在Jaxb转换的Enum类中检索@XmlEnumValue注释属性值

使用JAXB在XML元素中使用marshall属性