Я пытаюсь получить доступ к внешнему веб-сервису из приложения на основе 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" в оболочках запросов и ответов. Нужно ли создавать дополнительные классы для этого вызова на работу?