JAXB Marshaller标头的Java8问题 [英] Java8 Issue With JAXB Marshaller Header

查看:118
本文介绍了JAXB Marshaller标头的Java8问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个库,该库使用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库

JARBContext在运行时在两个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依赖项):

jar:文件:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/rt.jar!/com/sun/xml/internal/bind/v2/runtime/JAXBContextImpl.班级编号:1.8.0_121

解决方案

原来对我而言,这是一个糟糕的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>

I have a library created which uses jaxb to marshal/unmarshal an xml payload related to web service calls (no json). These calls work perfectly in my library. Once I pull it into a larger project, the calls to setProperty() fail with the following exception.

javax.xml.bind.PropertyException: name: com.sun.xml.internal.bind.xmlHeaders value: <?xml version="1.0" encoding="UTF-8"?>

anyone have any ideas what is going on here? My searches have all come up as wild goose chases. Here's the method in question:

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

I've seen both 'com.sun.xml.internal.bin.xmlHeaders' and 'com.sun.xml.bind.xmlHeaders' in various document and blogs. Both options throw an exception, but each in a different project.

com.sun.xml.internal.. throws an exception in my consuming jar when method executed as larger problem space:

javax.xml.bind.PropertyException: name: com.sun.xml.internal.bind.xmlHeaders value: <?xml version="1.0" encoding="UTF-8"?>

com.sun.xml.. throws an exception in my library jar when method executed in isolation:

javax.xml.bind.PropertyException: name: com.sun.xml.bind.xmlHeaders value: <?xml version="1.0" encoding="UTF-8"?>

JAXB Libraries

The JAXBContext differs between the two jars during run time. I've tried to force the JAXB library via maven dependency:

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.2.3</version>
</dependency>

In the case of the consuming project here's the 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

In the case of my reusable library the context is (completely ignoring my jaxb-api:2.2.3 dependency):

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

解决方案

Turned out to be a bad maven dependency on my part. There are two jaxb related dependencies that looked correct, jaxb-api and jaxb-impl. The jaxb-impl fixed my problem

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.2.3</version>
    </dependency>

这篇关于JAXB Marshaller标头的Java8问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆