java - 编码失败,但有关此上下文未知的 MarshallerImpl 异常

标签 java jaxb marshalling

我有一个相对简单的包,包含 8 个 Java 类,这些类是使用 JAXB XJC 从 XML 模式生成的。我还有一个实用程序类来编码和解码该类的实例。

这行得通

实用程序类可以成功地将有效的 XML 文档解码为“根”类 WordMergeInfo 的实例。例如,这很好用:

    JAXBContext jc = JAXBContext.newInstance(WordMergeInfo.class);
    Unmarshaller um = jc.createUnmarshaller();
    return (WordMergeInfo)um.unmarshal(inputStream);

这行不通

但是编码到字符串失败。在这段代码中:

    JAXBContext jc = JAXBContext.newInstance(WordMergeInfo.class);
    Marshaller m = jc.createMarshaller();
    StringWriter writer = new StringWriter();
    m.marshal(m, writer);
    return writer.toString();

调用 Marshaller.marshal 失败并出现以下错误:

javax.xml.bind.JAXBException: class com.sun.xml.bind.v2.runtime.MarshallerImpl nor any of its super class is known to this context.
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:594)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:482)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:315)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:244)

据我了解,它的任何父类(super class)在此上下文中都是未知的 意味着无法找到编码所需的 JAXB 类。那么,当堆栈跟踪中存在同一类时,为什么找不到 JAXB 实现类之一?

上下文

这个错误出现在我的类(class)的单元测试中,在 Maven 下运行。依赖项是:

  • javax.xml.bind:jaxb-api:2.1
  • com.sun.xml.bind:jaxb-impl:2.1.13

我在早期版本(分别为 2.0 和 2.0.3)中遇到了同样的错误。

Maven 测试类路径为:

C:\Users\mstra.CUSTMAN\Workspace\DARTCorrModule\xml\target\test-classes
C:\Users\mstra.CUSTMAN\Workspace\DARTCorrModule\xml\target\classes
C:\Users\mstra.CUSTMAN\.m2\repository\javax\xml\bind\jaxb-api\2.1\jaxb-api-2.1.jar
C:\Users\mstra.CUSTMAN\.m2\repository\javax\xml\stream\stax-api\1.0-2\stax-api-1.0-2.jar
C:\Users\mstra.CUSTMAN\.m2\repository\javax\activation\activation\1.1\activation-1.1.jar
C:\Users\mstra.CUSTMAN\.m2\repository\com\sun\xml\bind\jaxb-impl\2.1.13\jaxb-impl-2.1.13.jar
C:\Users\mstra.CUSTMAN\.m2\repository\junit\junit\4.8.2\junit-4.8.2.jar
C:\Users\mstra.CUSTMAN\.m2\repository\org\mockito\mockito-all\1.8.5\mockito-all-1.8.5.jar
C:\Users\mstra.CUSTMAN\.m2\repository\javax\ejb\ejb-api\3.0\ejb-api-3.0.jar
C:\Users\mstra.CUSTMAN\.m2\repository\org\slf4j\slf4j-api\1.6.4\slf4j-api-1.6.4.jar

欢迎任何见解。

最佳答案

nor any of its super class is known to this context

这意味着该类未在 JAXB 上下文中注册为可编码类。

你的错误在这一行:

m.marshal(m, writer);

您正在尝试编码编码器本身。您可能打算编码(marshal)一个 WordMergeInfo 对象。

关于java - 编码失败,但有关此上下文未知的 MarshallerImpl 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9388873/

相关文章:

c# - 将 wchar_t 转换为 Char

java - XML 中的时间戳标记为空 - Java Marshaller

java - 是否可以删除 WS 结果中的包装器元素?

java - 使用父类(super class)的 JAXB 注释子类 XMLRootElement 名称值

java - 使用独立于eclipse的eclipse插件

Java:ByteArray 到正数,反之亦然

java - 为什么在 Apache Felix 中运行时 JAXB 找不到我的 jaxb.in​​dex?

c# - 如何将 vector<int> 从 C++ dll 编码到 C# 应用程序?

java - 可序列化的 ObjecOutputStream 对象

java - 分数在计算机中是如何表示的?