我有一个相对简单的包,包含 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/