Использование внешнего веб-сервиса с использованием Spring 3.1 - PullRequest
0 голосов
/ 07 января 2012

Я пытаюсь получить доступ к внешнему веб-сервису из приложения на основе Spring 3.1. Я хочу вызвать этот метод веб-службы с именем ListProductNames с одним строковым аргументом и прочитать ответ. Необходимая часть из файлов WSDL и Schema приведена ниже:

...
...
<operation name="ListProductNames">
<soap:operation soapAction="urn:ListProductNames" style="document"/>
<input><soap:body use="literal"/></input>
<output><soap:body use="literal"/></output>
</operation>

<message name="ListProductNamesIn">
<part name="parameter" element="tns:ListProductNamesRequest"/>
</message>
<message name="ListProductNamesOut">
<part name="parameter" element="tns:ListProductNames"/>
</message>

...

<s:element name="ListProductNamesRequest">
<s:complexType>
<s:sequence>
<s:element name="NameFilter" type="s:string" minOccurs="0"/>
</s:sequence>
</s:complexType>
</s:element>

<s:element name="ListProductNames">
<s:complexType>
<s:sequence>
<s:element name="Product" type="tns:ProductNameType" minOccurs="0" maxOccurs="unbounded"/>
</s:sequence>
</s:complexType>
</s:element>

<s:complexType name="ProductNameType">
<s:sequence>
<s:element name="Name" type="s:string"/>
<s:element name="Identifier" type="s:int"/>
<s:element name="Marketer" type="s:string"/>
</s:sequence>
</s:complexType>

Я настроил компонент следующим образом:

<bean id="myWebService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
    <property name="serviceInterface" value="com.xyz.TestService"/>
    <property name="wsdlDocumentUrl" value="http://servername.net:6464/WSTest.wsdl"/>
    <property name="namespaceUri" value="http://test.abcd.com/"/>
    <property name="serviceName" value="TestService"/>
    <property name="portName" value="TestServiceSoap"/>
</bean> 

Сейчас я пытаюсь создать интерфейс службы. Вот где у меня проблемы.

@WebService(name="TestServiceSoap", targetNamespace="http://test.abcd.com/")
public interface MyWebService {
@WebMethod(operationName="ListProductNames", action="urn:ListProductNames")
@WebResult(name="Product", targetNamespace="http://test.abcd.com/")
@RequestWrapper(localName="ListProductNamesRequest", targetNamespace="http://test.abcd.com/", className="??")
@ResponseWrapper(localName="ListProductNames", targetNamespace="http://test.abcd.com/", className="??")
public String listProductNames(@WebParam(name="NameFilter", targetNamespace="http://test.abcd.com/") String name);
}

Поскольку запрос и ответ являются сложными типами (как указано в WSDL), я не уверен, как их указать в аннотации выше. Кроме того, что я указываю как "className" в оболочках запросов и ответов. Нужно ли создавать дополнительные классы для этого вызова на работу?

1 Ответ

3 голосов
/ 07 января 2012

Обычно считается более эффективной практикой использовать нисходящий подход при разработке веб-сервисов. Начните со схемы XML, затем запустите wsimport (часть JDK), чтобы сгенерировать ваши классы и интерфейсы. Он должен генерировать файл-заглушку для службы и клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...