JAXB创建空对象

时间:2011-06-27 18:39:54

标签: java jaxb classcastexception

我有一个基于XSD的XML。 xsd是

<xs:complexType name="objectOneType" mixed="true">
    <xs:sequence>
        <xs:element ref="nestedObject" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="attribute" type="xs:string" use="optional"/>
</xs:complexType>

现在,当我收到这个XML

<xmlresponse>
  <xmlrequest>
    <objectone attribute="changed" />
  </xmlrequest>
  <xmlsrc>
    <objectone attribute="changed" />
  </xmlsrc>
</xmlresponse>

在此XML中,对象 OBjECTONE 没有名为 NESTEDOBJECT 的对象。它现在不是忽略它,而是在 OBJECTONE 中插入一个对象,该对象是 STRING 类型。所以当我的代码尝试处理 OBJECTONE 时,假设它有一个对象类型 NESTEDOBJECT 。它抛出了一个classcast异常。

有什么想法吗?

P.S:杀死我sicne我正在使用JAXB 1.2

1 个答案:

答案 0 :(得分:2)

关键是注释mixed="true"。使用此注释结构,如

<content>
  <italic>Italic</italic> ist not <underline>underline</underline>
</content>

是可能的。 JAXB内部创建了一个List<Object> insideContent,它将包含大写的类:StringItalicStringUnderlineString。我假设您输出的XML类似于Marshaller.JAXB_FORMATTED_OUTPUT,它为格式化输出插入换行符和制表符。你可以:

  • 不要使用格式化输出:<content><italic>This</italic> is a <underline>test</underline></content>不应该有前导或尾随String
  • 请勿使用mixed="true"
  • 在迭代instanceOf
  • 时,使用List<Object>测试您的子课程