У меня есть веб-сервис ASP.NET 2.0, который вызывается из JAX-WS 2.1. Если я тестирую с SOAP UI, это работает. SOAP UI генерирует запрос вида
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sup="abc.123">
<soapenv:Header/>
<soapenv:Body>
<sup:Method>
<sup:element>GBA</sup:element>
<sup:attributes>
<sup:Attribute>
<sup:attributeName>XYZ</sup:attributeName>
<sup:attributeValue>123</sup:attributeValue>
</sup:Attribute>
</sup:attributes>
<sup:nop>abc</sup:nop>
<sup:data>1</sup:data>
</sup:Method>
</soapenv:Body>
</soapenv:Envelope>
Это работает правильно, и веб-сервис получает и правильно обрабатывает данные. Однако клиент JAX-WS создает запрос в форме
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<Method xmlns="abc.123">
<element>
<name>GBA</name>
</element>
<attributes>
<Attribute>
<attributeName>XYZ</attributeName>
<attributeValue>123</attributeValue>
</Attribute>
</attributes>
<nop>abc</nop>
<data>1</data>
</Method>
</soapenv:Body>
</soapenv:Envelope>
Это не работает правильно. Веб-сервис ASP.NET интерпретирует все параметры , кроме element
, как null
. Очевидно, что это приводит к сбою обработки. Сообщение возвращается и правильно интерпретируется прокси-сервером JAX-WS.
Как я могу заставить JAX-WS (либо в поколении клиента, либо в коде) использовать префикс пространства имен? В качестве альтернативы есть способ сообщить ASP.NET, как интерпретировать сообщение SOAP как есть
До сих пор я читал о JAX-WS, и кажется, что есть множество вариантов настройки созданной java, но я не нашел никаких параметров или правил привязки для настройки того, как он создает SOAP.
Единственное, что я нашел многообещающим, - это использование SoapHandler
для ручного редактирования конструкции xml, как было предложено в этого ответа . Однако это включает в себя написание кода для обхода DOM и добавления префикса к каждому узлу. Я еще не опробовал эту опцию ...