JAXB 创建空对象

发布于 2024-11-17 07:21:22 字数 913 浏览 4 评论 0原文

我有一个基于 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。它抛出类广播异常。

有什么想法吗?

PS:杀了我,因为我正在使用 JAXB 1.2

I have an XML based on XSD. The xsd is

<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>

Now, when i receive this XML

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

In this XML, the object OBjECTONE doesn't have an object named NESTEDOBJECT. now instead of ignoring it, it is inserting a an empty object in OBJECTONE which is of STRING type. so when my code tries to process OBJECTONE assuming it has an object type NESTEDOBJECT. It throws classcast exception.

Any idea?

P.S: Kill me sicne i am using JAXB 1.2

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

对你的占有欲 2024-11-24 07:21:22

关键是注释mixed="true"。有了这个注释结构,这样的结构

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

就成为可能。 JAXB 在内部创建一个 List。 insideContent 属于大写类:StringItalicStringUnderline字符串。我假设您使用类似于 Marshaller.JAXB_FORMATTED_OUTPUT 的内容输出 XML,它会为格式化输出插入换行符和制表符。您可以:

  • 不使用格式化输出:This是一个test 不应有前导或尾随 String
  • 不要使用 mixed="true" >
  • 在迭代 List时使用 instanceOf 测试您的子类

The key is the annotation mixed="true". With this annotation structures like

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

are possible. Internally JAXB creates a List<Object> insideContent which would be in the upper case classes of: String, Italic, String, Underline and String. I assume that you output your XML with something like Marshaller.JAXB_FORMATTED_OUTPUT which inserts a newline and tabulator for the formatted output. You can either:

  • Don't use formatted output: <content><italic>This</italic> is a <underline>test</underline></content> should not have a leading or trailing String
  • Don't use mixed="true"
  • Test your child class with instanceOf while iterating the List<Object>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文