Порядок элементов JAXB UnMarshall Collection - продолжение - PullRequest
3 голосов
/ 31 мая 2011

Мне известно, что почти тот же вопрос задавался ранее ( здесь ).Несмотря на то, что есть один интересный ответ, все еще есть свободный конец (в случае демаршаллинга), который также, кажется, применим в нашем случае.

Вот наша ситуация: мы анализируем 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 ]

2 голосов
/ 31 мая 2011

Примечание: Я являюсь лидером EclipseLink JAXB (MOXy) и членом группы экспертов JAXB ( JSR-222 ).

Я не нашел точного упоминания в спецификации, но намерение состоит в том, чтобы сохранить порядок.Это причина того, что основным типом коллекции, используемым JAXB, является java.util.List.

До сих пор мы предполагали, что порядок будет сохранен в списках (массив), которые являются результатомпроцесс демаршаллинга.

Реализация JAXB для MOXy создаст список на основе упорядочения элементов, возвращаемых базовым синтаксическим анализатором XML (DOM, SAX, StAX).Я не могу представить, чтобы какая-либо реализация JAXB работала по-другому, поскольку ее было бы сложнее реализовать и она была менее интуитивной для пользователей.

Поэтому мне было интересно, может ли эта ситуация возникнуть из-за порядка маршалингаэлементы не определены явно.

Реализация JAXB для MOXy будет упорядочивать объекты в соответствии с упорядочением объектов в Списке.Опять же, я не могу представить, чтобы какая-либо реализация JAXB работала иначе, так как ее было бы сложнее реализовать и она была менее интуитивной.

0 голосов
/ 31 мая 2011

Вы можете указать это поведение в объявлении globalBindings .

Я предполагаю, что вы генерируете классы Java из файлов XSD, используя XJC.Вот самая важная часть элемента 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 (и подпункты) или посмотрите этот урок

...