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

问题描述 投票:1回答:1

我对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 jaxb2
1个回答
1
投票

确保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规范的一部分)。

© www.soinside.com 2019 - 2024. All rights reserved.