Поддерживает ли JAX-WS только <any namespace = "## other" />? - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь добавить некоторую прямую совместимость к Java-приложению, вызывающему Web-сервис на работе, но я сталкиваюсь с некоторыми проблемами с JAX-WS ...

Приложение использует wsdl2java плагин Mavenсоздать клиент веб-службы CXF из WSDL.Затем он использует этот сгенерированный клиент для связи с веб-службой (через SOAP через JMS).(Возможно, стоит отметить, хотя я не уверен, что атрибут wsdlLocation <jaxws:client/> по какой-то причине не заполнен, возможно, потому, что WSDL сам генерируется веб-службой Tibco и поэтому отсутствует некоторыеданные, которые будут использоваться как есть, например, местоположение веб-службы, данные, которые заполняются в элементе <jaxws:client/> в application-context.xml ...)

, поскольку JAXB довольно слаб с XML (см. На мой предыдущий вопрос ) я решил включить проверку схемы (<jaxws:client><jaxws:properties><entry key="schema-validation-enabled" value="true"/></jaxws:properties></jaxws:client>), которая работала довольно хорошо, и для улучшения прямой совместимости я использовал атрибут nillable и элемент <any/>, например:

<complexType>
    <sequence>
        <element nillable="true"/>
        <element nillable="true">
            <complexType>
                <sequence>
                    <element nillable="true" minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
            </complexType>
        </element>
        <any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
</complexType>

Таким образом, когда веб-служба добавляет элемент в конец типа, приложение должно поместить его в массив «any» и игнорировать его.

Обратите внимание, что элемент <any/> не упоминает свой атрибут namespace, который должен по умолчанию ##any.

Однако, когда я пытаюсь запустить приложение, я получаю следующую ошибку:
Unmarshalling Error: cvc-complex-type.2.4.a : Invalid content was found starting with element 'ns0:SomeNewElement'. One of '{WC[##other:\"http://some/namespace\"]}' is expected.
Так что, несмотря на отсутствие namespace, JAX-WS использовал namespace="##other"вместо namespace="##any".
я также попробовал другие пространства имен, такие как ##targetNamespace или ##any явно, или processContents="skip", с точно таким же результатом.

Почему JAX-WS игнорирует <any/> namespace, и как я могу использовать элемент <any/> с его полной мощностью?

...