1

我正在测试 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。

谢谢..

4

1 回答 1

1

这是EclipseLink MOXy和 RI之间的已知区别。我们在 MOXy 中为您正在编组到一个OutputStreamWriter根元素已被写入的用例打开了这扇门。

您是否指望抛出异常。当没有根元素时,您可以将对象包装在JAXBElement.

解决方法

您可以使用 aJAXBIntrospector来确定对象是否具有根元素。

JAXBIntrospector introspector = jaxbContext.createJAXBIntrospector();
QName rootElement = introspector.getElementName(aPOJO);
if(null == rootElement) {
    // ...
} else {
    // ...
}
于 2013-05-04T22:48:29.303 回答