我正在测试MOXy 2.5.0 RC1。
我将以下内容编组为字符串:
<c r="C3" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<v>20</v>
</c>
由https://github.com/plutext/docx4j/blob/master/src/xlsx4j/java/org/xlsx4j/sml/Cell.java
表示注意没有任何@XmlRootElement注释
使用参考实现,结果如预期的那样:
javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.internal.SAXException2: unable to marshal type "org.xlsx4j.sml.Cell" as an element because it is missing an @XmlRootElement annotation]
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:317)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:243)
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:96)
at org.docx4j.XmlUtils.marshaltoString(XmlUtils.java:507)
使用MOXy,结果是:
<v>20</v>
这是一个已知问题吗?我没试过2.4.2 RC1。
感谢..
答案 0 :(得分:1)
这是EclipseLink MOXy和RI之间的已知差异。我们已经在MOXy中打开了这个大门,用于编组已经编写了根元素的OutputStream
或Writer
的用例。
您指望抛出异常吗?如果没有根元素,则可以将对象包装在JAXBElement
。
解决方法强>
您可以使用JAXBIntrospector
来确定对象是否具有根元素。
JAXBIntrospector introspector = jaxbContext.createJAXBIntrospector();
QName rootElement = introspector.getElementName(aPOJO);
if(null == rootElement) {
// ...
} else {
// ...
}