JAXB UnMarshal Collection元素顺序 - 续

时间:2011-05-31 10:16:00

标签: java xml collections jaxb

我知道之前已经问过几乎相同的问题(here)。尽管有一个有趣的答案,但仍有一个松散的结束(在解组的情况下)似乎也适用于我们的情况。

以下是我们的情况:我们正在解析SOAP消息,其主体结构如下:

<complexType name="Body">
  <complexContent>
    <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
      <sequence>
        <element ref="{http://[message=spec url]"/>
      </sequence>
    </restriction>
  </complexContent>
</complexType>

到目前为止,我们假设 的顺序将保留在由解组过程产生的(数组)列表中。然后将元素写入表中,并在PL / SQL过程中进一步处理。这通常对序列中元素的顺序不敏感。 可能会发生SOAP消息中有两个引用同一对象的元素。这是一个错误。它被PL / SQL代码捕获,它通过记录情况并拒绝第二个元素来处理它。

我们现在的问题是,很少和(直到现在)完全不可重现,而不是第二个元素(如SOAP消息中所见)被拒绝,但第一个。从PL / SQL代码看,只有在以错误的顺序读取代表元素的数据时才会发生这种情况(再次与它们在消息中的显示方式进行比较)。

因此,我想知道是否会出现这种情况,因为未明确定义编组元素的顺序。 在对上述问题的回答中,看起来在使用JAXB进行编组的情况下定义了顺序。尚未得到答复的问题(chahuistle)是否也是解组的情况,目前尚未得到答复。

我很感激任何帮助!

2 个答案:

答案 0 :(得分:2)

注意:我是EclipseLink JAXB (MOXy)负责人,也是JAXB(JSR-222)专家组的成员。

我没有在规范中找到确切的提及,但目的是维持秩序。这就是JAXB使用的主集合类型为java.util.List的原因。

  到目前为止,我们已经假设了   将保留在。的顺序   (数组)列出的结果   解组过程。

JAXB的MOXy实现将基于底层XML解析器(DOM,SAX,StAX)返回的元素的排序构建一个列表。我无法想象任何JAXB实现的行为都不同,因为它更难实现,对用户来说也不那么直观。

  

因此,我想知道是否这样   情况可能会因为而出现   编组元素的顺序是   没有明确定义。

JAXB的MOXy实现将根据List中对象的排序封送对象。再一次,我无法想象任何JAXB实现的行为都会有所不同,因为它实现起来会更难以实现,也不那么直观。

答案 1 :(得分:0)

您可以在 globalBindings 声明中指定此行为。

我假设您正在使用XJC从XSD文件生成Java类。以下是 globalBindings 元素中最重要的部分:

<globalBindings>
  [ collectionType = "collectionType" ]
  [ fixedAttributeAsConstantProperty  = "true" | "false" | "1" | "0" ]
  [ generateIsSetMethod  = "true" | "false" | "1" | "0" ]
  [ enableFailFastCheck = "true" | "false" | "1" | "0" ]
  [ choiceContentProperty = "true" | "false" | "1" | "0" ]
  [ underscoreBinding = "asWordSeparator" | "asCharInWord" ]
  [ typesafeEnumBase = "typesafeEnumBase" ]
  [ typesafeEnumMemberName = "generateName" | "generateError" ]
  [ enableJavaNamingConventions = "true" | "false" | "1" | "0" ]
  [ bindingStyle = "elementBinding" | "modelGroupBinding" ]
  [ <javaType> ... </javaType> ]*
</globalBindings> 

*collectionType can be either indexed or any fully qualified class name that implements java.util.List.

我猜测将其设置为索引可以解决所有问题。

以下是spec. document (take a look at section 7.5 and 6.12 (and subparagraphs)的链接或查看this tutorial