| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Веб сервис - "Cannot find dispatch method for" |
| Автор: N0dwis 15.10.2010, 17:06 | ||||||||
| Собственно, как в теме написано. wsdl
запрос
и в результате
Но что интересно - вот такой запрос срабатывает!
Но ведь это бред - судя по wsdl сообщения getList нет вообще! |
| Автор: N0dwis 17.10.2010, 22:03 | ||||||||
| Решение просто, как все гениальное Только почему-то описание этих нюансов нашел только в книге http://books.google.com/books?id=W2XrQRMIEd4C&printsec=frontcover&source=gbs_atb#v=onepage&q&f=false. Вся загвоздка была в способе передачи параметров, который задается аннтотацией @SOAPBinding. Их может быть 2 - wrapped и bare. В случае wrapped в wsdl файле описание аргументов сервиса задается вот так
А дальше tns:getList описывается как complexType
Способ описания аргументов это только одно из правил описания сервиса, которое зависит от выбранного "стиля связывания" (не знаю, как по-другому обозвать) сервиса. Он задается в секции binding wsdl файла вот так.
А вот еще одним правилом, зависящим от "стиля связывания" является вызов сервиса и ограничение на количество функций. При bare стиле передачи аргументов нельзя задавать более одной функции на сервис, т.е. uri /service/orders будет всегда вызывать строго определенную функцию сервиса. И при его вызове не используется имя сообщения вообще. Что и получается в последнем запросе из моего предыдущего поста. Насчет одной функции я не уверен. Кажется, можно все-таки несколько, но при этом их сигнатуры должны отличаться. При wrapped стиле все эти ограничения отсутствуют и там уже используются имена сообщений для вызова нужной функции. Для тестирования сервиса я использовал msSoap.SoapClient30, но похоже он не позволяет автоматически работать с wrapped стилем передачи параметров. Т.е. код
будет работать только если сервис использует bare стиль передачи параметров, в противном случае получается ошибка "Incorrect number of parameters supplied for SOAP request". Работать с wrapped стилем передачи параметров придется руками - см. функции StartEnvelope, StartBody и т.п. Там есть пример. Вот, в общем-то и все. |