18 november, 2010

WSDL/Webservice prototyping i JDK 6

 JDK 6 har stöd för WebServices i form av JAX-WS 2.0. Detta är i sig en trevlig feature men det finns ännu en som jag upptäckte nyligen. JDK 6 är bundlat med en enkel HTTP-Server som kan användas för att enkelt testa sina JAX-WS WebServices. En enkel POJO-WebService kan (i sin enklaste form) se ut enligt såhär.

@WebService
public class Calculator {

 public int sum(int... numbers){
  int result = 0;
  for(int number : numbers){
   result += number;
  }
  return result;
 }

}

Inga konstigheter här, men här kommer det som är intressant. För att publicera denna WebService i JDK 6 inbyggda server lägger vi till en körbar main-metod.

@WebService
public class Calculator {

 public int sum(int... numbers){
  int result = 0;
  for(int number : numbers){
   result += number;
  }
  return result;
 }
 
 public static void main(String[] a){
  Endpoint.publish("http://localhost:8080/ws/calculator", new Calculator());
 }

}

Öppna en browser och peka på http://localhost:8080/ws/calculator?WSDL för att se tjänstens WSDL.
<definitions name="CalculatorService" targetnamespace="http://ws.se/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.se/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/">
 <types>
  <xsd:schema>
   <xsd:import namespace="http://ws.se/" schemalocation="http://localhost:8080/ws/calculator?xsd=1"></xsd:import>
  </xsd:schema>
 </types>

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

 <porttype name="Calculator">
  <operation name="sum">
   <input message="tns:sum" />
   <output message="tns:sumResponse"></output>
  </operation>
 </porttype>

 <binding name="CalculatorPortBinding" type="tns:Calculator">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http"></soap:binding>
  <operation name="sum">
   <soap:operation soapaction=""></soap:operation>
   <input />
    <soap:body use="literal"></soap:body>
   
   <output>
    <soap:body use="literal"></soap:body>
   </output>
  </operation>
 </binding>

 <service name="CalculatorService">
  <port binding="tns:CalculatorPortBinding" name="CalculatorPort">
   <soap:address location="http://localhost:8080/ws/calculator"></soap:address>
  </port>
 </service>
</definitions>
Riktigt trevligt! Detta ger bra möjligheter att snabbt ta fram en tjänst via prototyping, genom att använda andra JAX-WS annotations (@WebParam, @WebMethod, @WebResult m.fl.) kan vi skräddarsy utseendet på tjänstens WSDL. För snabbt kunna testa sin tjänst skulle jag rekommendera gratisverktyget Soap UI. Det skönt att slippa generera klientkod för varje förändring man gör i sin WSDL, då kan ett verktyg som Soap UI vara en riktigt bra kompis att hålla i handen.

Inga kommentarer:

Skicka en kommentar