Сложный тип с одним элементом массива создает исключение маршалинга - PullRequest
4 голосов
/ 18 октября 2011

У нас есть веб-сервис в стиле JAX-RPC со сложным типом, определенным следующим образом:

<xs:complexType name = "SomeFault">
<xs:sequence>
<xs:element name = "errorMessages" type="some:ErrorMessageWSType" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>

<xs:simpleType name = "ErrorMessageWSType">
<xs:restriction base = "xs:NMTOKEN">
<xs:enumeration value = "INVALID_1"/>
<xs:enumeration value = "INVALID_2"/>
<xs:enumeration value = "INVALID_3"/>
</xs:restriction>
</xs:simpleType>

Мы сталкиваемся с исключением Marshaling на стороне сервера, когда комплексный тип ответа / сбоя имеет один массивполе типа.

weblogic.wsee.codec.CodecException: не удалось кодировать com.bea.xml.XmlException: не удалось найти подходящий тип привязки для использования в объекте сортировки "[Lnamespace.type.ErrorMessageWSType; @ 693767e9" .используя тип схемы: t = SomeFault @ http://namespace/SOME/v1 тип java: namespace.type.ErrorMessageWSType []

Если мы изменим SomeFault, добавив еще один элемент в сложный тип, ошибка исчезнет.

<xs:complexType name = "SomeFault">
<xs:sequence>
<xs:element name = "errorMessages" type="some:ErrorMessageWSType" maxOccurs="unbounded" />
<xs:element name = "dummyString" type="xsd:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>

Мы что-то делаем не так во время генерации кода wsdlc или это известная проблема?

Аналогичный вопрос уже размещен на https://forums.oracle.com/forums/thread.jspa?messageID=4462906,, нобез какого-либо ответа, любые указатели были бы замечательно.

Спасибо.

1 Ответ

1 голос
/ 25 октября 2011

Не знаю, решает ли это часть вопроса «почему», но вы можете попробовать переписать часть последовательности следующим образом:

<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="errorMessages" type="some:ErrorMessageWSType"/>
</xs:sequence>

OTOH, какой может быть механизм, который позволяет работать второму случаю, но не первому? Может ли быть так, что маршаллер должен выяснить, что означает xsd:string, прежде чем проверять, что означает some:ErrorMessageWSType, а затем должен разбудить распознаватель или что-то еще? Эта линия мысли ведет ко второму подходу, который я бы попробовал, который должен был бы объявить ErrorMessageWSType перед SomeFault (и, возможно, в другом пространстве имен, просто чтобы посмотреть, исправит ли это что-нибудь).

Только мои (уставшие) два цента, и я полагаю, что оба эти подхода предполагают какую-то ошибку в маршаллере, потому что я не вижу, что что-то в вашем примере кода не соответствует схеме XML определение.

...