我知道之前已经问过几乎相同的问题(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)是否也是解组的情况,目前尚未得到答复。
我很感激任何帮助!
答案 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