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

ece*_*ulm 5 jaxb

我对JAXB 2.2.11 文档感到困惑, 其中属性被描述为com.sun.xml.bind.xmlHeaders但是当我尝试时:

javax.xml.bind.PropertyException: name: com.sun.xml.bind.xmlHeaders
Run Code Online (Sandbox Code Playgroud)

但是使用com.sun.xml.internal.bind.xmlHeaders(note: internal) 有效。

所以我的问题实际上是关于这样做的基本原理。我在看错误的文档吗?哪里internal来的?

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);
}
Run Code Online (Sandbox Code Playgroud)

ece*_*ulm 6

确保 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.11com.sun.xmlbind:jaxb-impl:2.2.11

如果您使用 Maven:

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.2.11</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

支持com.sun.xml.bind.xmlHeaders(否internal)。

或者如果您使用:

<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>
Run Code Online (Sandbox Code Playgroud)

你也得到com.sun.xml.bind.xmlHeaders.

但如果你使用:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2.11</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

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