问题描述
|
我知道之前(这里)曾问过几乎相同的问题。尽管有一个有趣的答案,但仍有一个松散的结局(在非编组情况下)似乎也适用于我们的情况。
这是我们的情况:我们正在解析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节(以及子段落)或本教程)