元帅行为的差异

时间:2013-05-04 22:18:50

标签: jaxb eclipselink moxy

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

感谢..

1 个答案:

答案 0 :(得分:1)

这是EclipseLink MOXy和RI之间的已知差异。我们已经在MOXy中打开了这个大门,用于编组已经编写了根元素的OutputStreamWriter的用例。

您指望抛出异常吗?如果没有根元素,则可以将对象包装在JAXBElement

的实例中

解决方法

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

JAXBIntrospector introspector = jaxbContext.createJAXBIntrospector();
QName rootElement = introspector.getElementName(aPOJO);
if(null == rootElement) {
    // ...
} else {
    // ...
}