【问题标题】:Java8 Issue With JAXB Marshaller HeaderJAXB Marshaller 标头的 Java8 问题
【发布时间】:2017-08-08 22:29:30
【问题描述】:

我创建了一个库,它使用 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());
}

xmlHeaders

我在各种文档和博客中都看到了“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"?>

JAXB 库

在运行时,两个 jar 的 JAXBContext 不同。我试图通过 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 依赖项):

jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/rt.jar!/com/sun/xml/internal/bind/v2/runtime/JAXBContextImpl.类 Build-Id:1.8.0_121

【问题讨论】:

  • “更大的项目”在运行时使用什么java版本?
  • jaxb 库问题可能吗?
  • 当我搜索 JDK 的 JAXB 实现的 source code 时,我找到了一个名为 com.sun.xml.bind.xmlHeaders 的常量,但没有找到一个名为 com.sun.xml.internal.bind.xmlHeaders 的常量。尝试使用不带internal 的名称。
  • 两个项目都是 java8
  • 我已经编辑了问题以解决上面的 cmets。

标签: java xml jaxb


【解决方案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>

【讨论】:

    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多