Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Веб сервис - "Cannot find dispatch method for" 
V
    Опции темы
N0dwis
Дата 15.10.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 18.9.2007
Где: Луганск

Репутация: нет
Всего: 4



Собственно, как в теме написано.
wsdl
Код

<!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.1-b01-. -->
<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.1-b01-. -->
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
    xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy"
    xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="ns:Orders" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="ns:Orders" name="OrdersService"> 
<types> 
<xsd:schema> 
<xsd:import namespace="ns:Orders" schemaLocation="http://localhost:8080/t/services/orders?xsd=1" /> 
</xsd:schema> 
</types> 
<message name="getList"> 
<part name="ownerId" element="tns:ownerId" /> 
</message> 
<message name="getListResponse"> 
<part name="getListResponse" element="tns:getListResponse" /> 
</message> 
<message name="getOrder"> 
<part name="id" element="tns:id" /> 
</message> 
<message name="getOrderResponse"> 
<part name="getOrderResponse" element="tns:getOrderResponse" /> 
</message> 
<portType name="Orders"> 
<operation name="getList"> 
<input wsam:Action="ns:Orders/Orders/getListRequest" message="tns:getList" /> 
<output wsam:Action="ns:Orders/Orders/getListResponse" message="tns:getListResponse" /> 
</operation> 
<operation name="getOrder"> 
<input wsam:Action="ns:Orders/Orders/getOrderRequest" message="tns:getOrder" /> 
<output wsam:Action="ns:Orders/Orders/getOrderResponse" message="tns:getOrderResponse" /> 
</operation> 
</portType> 
<binding name="OrdersPortBinding" type="tns:Orders"> 
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> 
<operation name="getList"> 
<soap:operation soapAction="" /> 
<input> 
<soap:body use="literal" /> 
</input> 
<output> 
<soap:body use="literal" /> 
</output> 
</operation> 
<operation name="getOrder"> 
<soap:operation soapAction="" /> 
<input> 
<soap:body use="literal" /> 
</input> 
<output> 
<soap:body use="literal" /> 
</output> 
</operation> 
</binding> 
<service name="OrdersService"> 
<port name="OrdersPort" binding="tns:OrdersPortBinding"> 
<soap:address location="http://localhost:8080/t/services/orders" /> 
</port> 
</service> 
</definitions>


запрос
Код

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope
    xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema"
    xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
    <SOAPSDK4:getList xmlns:SOAPSDK4="ns:Orders">
        <ownerId>1</ownerId>
    </SOAPSDK4:getList>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


и в результате
Код

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
    <faultcode>S:Client</faultcode>
    <faultstring>Cannot find dispatch method for {ns:Orders}getList</faultstring>
</S:Fault>
</S:Body>
</S:Envelope>


Но что интересно - вот такой запрос срабатывает!
Код

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope
    xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema"
    xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
    <SOAPSDK4:ownerId xmlns:SOAPSDK4="ns:Orders">1</SOAPSDK4:ownerId>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Но ведь это бред - судя по wsdl сообщения getList нет вообще!

Это сообщение отредактировал(а) N0dwis - 17.10.2010, 19:30
PM MAIL   Вверх
N0dwis
Дата 17.10.2010, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 18.9.2007
Где: Луганск

Репутация: нет
Всего: 4



Решение просто, как все гениальное smile
Только почему-то описание этих нюансов нашел только в книге Eben Hewitt "Java SOA cookbook".
Вся загвоздка была в способе передачи параметров, который задается аннтотацией  @SOAPBinding. Их может быть 2 - wrapped и bare. В случае wrapped в wsdl файле описание аргументов сервиса задается вот так
Код

<message name="getList"> 
    <part name="parameters" element="tns:getList" /> 
</message> 

А дальше tns:getList описывается как complexType
Код

<xs:complexType name="getList"> 
    <xs:sequence> 
        <xs:element name="id" type="xs:int" /> 
    </xs:sequence> 
</xs:complexType> 


Способ описания аргументов это только одно из правил описания сервиса, которое зависит от выбранного "стиля связывания" (не знаю, как по-другому обозвать) сервиса. Он задается в секции binding wsdl файла вот так.
Код

<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />


А вот еще одним правилом, зависящим от "стиля связывания" является вызов сервиса и ограничение на количество функций. При bare стиле передачи аргументов нельзя задавать более одной функции на сервис, т.е. uri /service/orders будет всегда вызывать строго определенную функцию сервиса. И при его вызове не используется имя сообщения вообще. Что и получается в последнем запросе из моего предыдущего поста.
Насчет одной функции я не уверен. Кажется, можно все-таки несколько, но при этом их сигнатуры должны отличаться.
При wrapped стиле все эти ограничения отсутствуют и там уже используются имена сообщений для вызова нужной функции.

Для тестирования сервиса я использовал msSoap.SoapClient30, но похоже он не позволяет автоматически работать с wrapped стилем передачи параметров.
Т.е. код
Код

var soap = WScript.CreateObject("msSOAP.SoapClient30");
var res = soap.msSOAPinit("http://localhost/srv/hello?wsdl");
var h = soap.sayHello("n0dwis");

будет работать только если сервис использует bare стиль передачи параметров, в противном случае получается ошибка "Incorrect number of parameters supplied for SOAP request".
Работать с wrapped стилем передачи параметров придется руками - см. функции StartEnvelope, StartBody и т.п. Там есть пример.

Вот, в общем-то и все.   smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0425 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.