Как я могу справиться с демаршалингом SOAP сообщений Castor, когда пространство имен определено внутри тега операции?

StackOverflow https://stackoverflow.com/questions/626648

Вопрос

Я разрабатываю первый контрактный веб-сервис на основе 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 стоит проверить, что входит и выходит.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top