我创建了一个库,它使用jaxb编组/解组与Web服务调用相关的xml有效负载(无json)。这些调用在我的库中完美运行。一旦我将其拉入更大的项目,对setProperty()的调用将失败,并出现以下异常。
javax.xml.bind.PropertyException: name: com.sun.xml.internal.bind.xmlHeaders value: <?xml version="1.0" encoding="UTF-8"?>
任何人都有任何想法在这里发生了什么?我的搜索都是疯狂的追逐。这是有问题的方法:
public String serializeXML() throws JAXBException, UnsupportedEncodingException {
JAXBContext context = JAXBContext.newInstance(MPICRequest.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<!DOCTYPE xgdquery SYSTEM \"xgdquery.dtd\">");
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
marshaller.marshal(this, byteStream);
return new String(byteStream.toByteArray());
}
我在各种文档和博客中都看到了'com.sun.xml.internal.bin.xmlHeaders'和'com.sun.xml.bind.xmlHeaders'。这两个选项都会引发异常,但每个选项都在不同的项目中。
com.sun.xml.internal ..当方法作为更大的问题空间执行时,在我的消费jar中引发异常:
javax.xml.bind.PropertyException: name: com.sun.xml.internal.bind.xmlHeaders value: <?xml version="1.0" encoding="UTF-8"?>
com.sun.xml ..在单独执行方法时,在我的库jar中抛出异常:
javax.xml.bind.PropertyException: name: com.sun.xml.bind.xmlHeaders value: <?xml version="1.0" encoding="UTF-8"?>
JAXBContext在运行时的两个jar之间有所不同。我试图通过maven依赖强制JAXB库:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.3</version>
</dependency>
对于消费项目,这里是JAXBContext:
jar:file:/private/tmp/hadoop-usr/nm-local-dir/usercache/usr/appcache/application_1502287345977_0001/filecache/10/porter-samza-0.4.14-dist.tar.gz/lib/jaxb-impl-2.2.3-1.jar!/com/sun/xml/bind/v2/runtime/JAXBContextImpl.class Build-Id: 2.2.3
对于我的可重用库,上下文是(完全忽略我的jaxb-api:2.2.3依赖):
罐:文件:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/rt.jar / COM /太阳/ XML /内部/结合/ V2 /运行/ JAXBContextImpl。 class Build-Id:1.8.0_121
答案 0 :(得分:1)
对我而言,原来是一个糟糕的maven依赖。有两个看似正确的jaxb相关依赖项,jaxb-api和jaxb-impl。 jaxb-impl解决了我的问题
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.3</version>
</dependency>