Как я могу справиться с демаршалингом SOAP сообщений Castor, когда пространство имен определено внутри тега операции?
-
06-07-2019 - |
Вопрос
Я разрабатываю первый контрактный веб-сервис на основе Spring-WS. Я полагаюсь на маршалинг Кастора, и я столкнулся со следующей проблемой. Р>
Запросы принимаются, когда " xmlns " пространство имен определено в теге Envelope, например:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns="http://www.mycompany.com/MyService/schemas">
<soap:Header/>
<soap:Body>
<doPlaceHoldRequest>
<hold>
<accountInfo>
<accountNumber>123456789</accountNumber>
</accountInfo>
<extended>false</extended>
<afterHours>false</afterHours>
<amountSavings>1.00</amountSavings>
<amountChecking>0.00</amountChecking>
</hold>
</doPlaceHoldRequest>
</soap:Body>
</soap:Envelope>
Однако клиенты .NET и Java, сгенерированные из .wsdl, предоставленного Spring-WS (сгенерированного из XSD), формируют свои запросы следующим образом:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body>
<doPlaceHoldRequest
xmlns="http://www.mycompany.com/MyService/schemas">
<hold>
<accountInfo>
<accountNumber>123456789</accountNumber>
</accountInfo>
<extended>false</extended>
<afterHours>false</afterHours>
<amountSavings>1.00</amountSavings>
<amountChecking>0.00</amountChecking>
</hold>
</doPlaceHoldRequest>
</soap:Body>
</soap:Envelope>
Что приводит к тому, что Кастор выбрасывает неумышленное исключение. Как заставить Кастора распознать эти сообщения как действительные? Может быть, мой WSDL (или XSD, который я использовал для его генерации) был неправильным?
Решение
Если вы посмотрите этот блог, я думаю, что он никогда не перейдет на другие веб-сервисы :) http://springkbase.blogspot.com/2009/06/ весна-вебсервис-с-castor.html
Другие советы
Я сталкивался с этой проблемой снова и снова с моим первым веб-сервисом Spring-WS / Castor. Насколько я могу судить, где-то вдоль линии какой-то компонент извлекает полезную нагрузку без учета пространства имен. Другими словами, такой узел, как doPlaceHoldRequest, становится корнем XML-документа без наследования объявления пространства имен верхнего уровня, а в двух вышеупомянутых случаях это приводит к тому, что находится в требуемом пространстве имен, а другой - нет, поэтому один проверяет правильность вашей схемы, а другой - нет.
Лучшее решение, похоже, охватить все основы. Сделайте так, чтобы ваш XSD имел elementFormDefault = " квалифицированный " ;, чтобы все ваши элементы находились в пространстве имен. Затем укажите ns-uri и ns-prefix в каждом элементе map-to в вашем отображении Castor. Результат немного тяжелее, со всеми префиксами пространства имен, но, похоже, он становится менее хрупким, когда речь идет о недокументированном поведении ленивых клиентов и в компонентах сервера.
JAX-WS возвращает пустые списки . тоже. org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor
стоит проверить, что входит и выходит.