JAXB UnMarshall收集元素顺序-继续

问题描述

| 我知道之前(这里)曾问过几乎相同的问题。尽管有一个有趣的答案,但仍有一个松散的结局(在非编组情况下)似乎也适用于我们的情况。 这是我们的情况:我们正在解析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>
到现在为止,我们已经假设的顺序将保留在解组过程产生的(Array)List中。然后将元素写入表中,并在PL / sql过程中进行进一步处理。这通常对序列中元素的顺序不敏感。 可能会发生这种情况,因为SOAP消息中有两个引用相同对象的元素。这是一个错误。它被PL / sql代码捕获,后者通过记录情况并拒绝第二个元素来处理它。 现在的问题是,很少(并且直到现在)完全不可复制,不是第二个元素(如SOAP消息中所示)被拒绝,而是第一个元素被拒绝。从PL / sql代码看,只有当以错误的顺序读取表示万一元素的数据时,才会发生这种情况(再次与它们在消息中的显示方式进行比较)。 因此,我想知道是否会出现这种情况,因为没有明确定义编组元素的顺序。 在上述问题的答案中,看起来好像是在与JAXB一起编组的情况下定义了顺序。 (尚无答案)(由chahuistle回答)是否也适用于编组的问题尚未得到回答。 我将不胜感激!     

解决方法

        注意:我是EclipseLink JAXB(MOXy)的负责人,并且是JAXB(JSR-222)专家组的成员。 我尚未在规范中找到确切的提及,但目的是保持顺序。这就是JAXB使用的主要收集类型为
java.util.List
的原因。   到目前为止,我们假设   的顺序将保留在   (Array)列出由   解组过程。 JAXB的MOXy实现将基于基础XML解析器(DOM,SAX,StAX)返回的元素的顺序构建一个列表。我无法想象任何JAXB实现都有不同的表现,因为它难以实现,对用户而言也不太直观。   因此,我想知道这是否   可能会出现这种情况,因为   编组元素的顺序是   没有明确定义。 JAXB的MOXy实现将根据List中对象的顺序来封送对象。再次,我无法想象任何JAXB实现会有不同的表现,因为它将更难以实现且不那么直观。     ,        您可以在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.
我猜将其设置为索引应该可以解决所有问题。 这是规格链接。文档(请参阅第7.5和6.12节(以及子段落)或本教程)