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

Я разрабатываю первый контрактный веб-сервис на основе Spring-WS. Я полагаюсь на маршалинг Кастора, и я столкнулся со следующей проблемой.

Запросы принимаются, когда в теге Envelope определено пространство имен "xmlns", например:

<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, который я использовал для его генерации)?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Я сталкивался с этой проблемой снова и снова с моим первым веб-сервисом Spring-WS / Castor. Насколько я могу судить, где-то вдоль линии какой-то компонент извлекает полезную нагрузку без учета пространства имен. Другими словами, такой узел, как doPlaceHoldRequest, становится корнем XML-документа без наследования объявления пространства имен верхнего уровня, а в двух вышеупомянутых случаях это приводит к тому, что равно в требуемом пространстве имен, и один - нет, поэтому один проверяет правильность вашей схемы, а другой - нет.

Лучшее решение, по-видимому, - охватить все базы. Сделайте так, чтобы ваш XSD имел elementFormDefault = "qualised", чтобы все ваши элементы находились в пространстве имен. Затем укажите ns-uri и ns-prefix в каждом элементе map-to в вашем отображении Castor. Результат немного тяжелее, со всеми префиксами пространства имен, но кажется, что он делает его гораздо менее хрупким, когда речь идет о ленивых клиентах и недокументированное поведение в компонентах сервера.

JAX-WS возвращает пустые списки также имеет смысл. org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor стоит проверить, что входит и выходит.

1 голос
/ 14 июня 2009

Если вы посмотрите этот блог, я думаю, он никогда не пойдет на другие веб-сервисы :) http://springkbase.blogspot.com/2009/06/spring-webservice-with-castor.html

...