JAXB解组集合元素顺序-续

3
我知道之前有一个几乎相同的问题被提出过(在这里)。尽管有一个有趣的答案,但在反序列化的情况下仍存在一个未解决的问题,似乎也适用于我们的情况。
这是我们的情况:我们正在解析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提出)是在取消编组时是否也是如此。
我将不胜感激地接受任何帮助!

你如何解析消息,使用DOM还是SAX?因为根据这篇文章,使用SAX可以保留顺序:http://www.oracle.com/technetwork/articles/javase/index-140168.html(搜索“sequence”)。 - Martin Klinke
啊,抱歉,我忘了提到。我们正在使用SAXB。我会查看那篇文章的,谢谢! - Lúthien
解析器从文档开头开始,按照发现的顺序将文档的每个部分传递给应用程序。这似乎确实排除了SAX解析器作为可能的罪犯 :) - 再次感谢! - Lúthien
2个回答

2

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

虽然在规范中没有明确提到,但意图是要保持顺序一致。这就是JAXB使用的主要集合类型是java.util.List的原因。

直到现在,我们一直假设 从非结构化数据反序列化回来的 (Array)Lists 的顺序被保留。

JAXB的MOXy实现将基于底层XML解析器(DOM、SAX、StAX)返回的元素顺序构建列表。我无法想象任何JAXB实现行为不同,因为这样做更难实现且对用户不太直观。

因此,我想知道这种情况是否可能出现,因为 具体定义的元素顺序没有明确规定。

JAXB的MOXy实现将根据列表中对象的顺序编组对象。同样,我无法想象任何JAXB实现行为不同,因为这样做更难实现且对用户不太直观。


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.

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

这里有一个链接,可以查看规格文档(请查看第7.5节和6.12节(以及子段))或查看此教程


到目前为止,我们在build.xml中有这个:` `
  • 没有指定绑定文件。所以这看起来是一个很有前途的路线。谢谢!
- Lúthien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接