JAX-WS Tutorial: Precise WSDL
I know this is very simple web service. But I would like to highlight the importance of the use of JAX-WS annotations to get rid of the meaningless WSDL which is the main document for the web service consumer. I think, precise WSDL is advantage to maximum use of the web service.
Here the simple class
package com.ojitha.ws.second; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; @WebService(name = "Warehouse", serviceName = "WarehouseService", targetNamespace = "http://www.ojitha.com/stock") @SOAPBinding(style = Style.RPC) public class WarehouseImpl { @WebResult(name = "totalStock") public int getInventory(@WebParam(name = "firstNumber") int stockOnHand, @WebParam(name = "secondNumber") int stockToDeliver) { return stockOnHand + stockToDeliver; } }
Here the generated WSDL
<wsdl:definitions name="WarehouseService" targetNamespace="http://www.ojitha.com/stock" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.ojitha.com/stock" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:message name="getInventoryResponse"> <wsdl:part name="totalStock" type="xsd:int"/> </wsdl:message> <wsdl:message name="getInventory"> <wsdl:part name="firstNumber" type="xsd:int"/> <wsdl:part name="secondNumber" type="xsd:int"/> </wsdl:message> <wsdl:portType name="Warehouse"> <wsdl:operation name="getInventory"> <wsdl:input message="tns:getInventory" name="getInventory"/> <wsdl:output message="tns:getInventoryResponse" name="getInventoryResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="WarehouseServiceSoapBinding" type="tns:Warehouse"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getInventory"> <soap:operation soapAction="" style="rpc"/> <wsdl:input name="getInventory"> <soap:body namespace="http://www.ojitha.com/stock" use="literal"/> </wsdl:input> <wsdl:output name="getInventoryResponse"> <soap:body namespace="http://www.ojitha.com/stock" use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="WarehouseService"> <wsdl:port binding="tns:WarehouseServiceSoapBinding" name="WarehousePort"> <soap:address location="http://localhost:8080/SecondWSExample/WarehouseService"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
Well, compare the Java class and the WSDL contents:
- In the Java class (line 9), the name parameter in the @WebService defines the portType (line 9) in the WSDL.
- In the Java class (line 9), the serviceName parameter in the @WebService defines the definitions name (line 1) in the WSDL.
- In the Java class (line 9), the targetNamespace parameter in the @WebService defines the definitions targetNamespace (line 1) in the WSDL.
- In the Java class (line 12), the name parameter in the @WebResult defines the name of the “getInventoryResonse” (line 3) in the WSDL.
- In the Java class (line 13), the name parameters in the @WebParam define the part names of the “getInventory” message(line 6, 7) in the WSDL.
The request of the service is as follows
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stoc="http://www.ojitha.com/stock"> <soapenv:Header/> <soapenv:Body> <stoc:getInventory> <firstNumber>10</firstNumber> <secondNumber>20</secondNumber> </stoc:getInventory> </soapenv:Body> </soapenv:Envelope>
and the response as follows
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns1:getInventoryResponse xmlns:ns1="http://www.ojitha.com/stock"> <totalStock>30</totalStock> </ns1:getInventoryResponse> </soap:Body> </soap:Envelope>
Your comments are well come.
Comments
Post a Comment
commented your blog