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