Java: SOAP – Web Service in 15 Sekunden schreiben (Quickstart)

Web ServiceA und O einer serviceorientierten Architektur sind sogenannte Web Services. Web Services sind technische Schnittstellen, die bestimmte Informationen und/oder Funktionen bereitstellen. Überwiegend werden Web Service zur Kommunikation zwischen verschiedenen Programmen, Systemen, etc. verwendet.
Ich behaupte, dass innerhalb von 15 Sekunden wirklich JEDER Java-Entwickler einen eignen Webservice schreiben kann! Anhand der legendären Rechteck-Klasse erläutere ich den „Code First“-Ansatz. Beachten Sie bitte, dass ich das JDK 6 benutze und mit Eclipse arbeite.

 

Die RechteckService-Klasse

package main;

public class RechteckService {

	public float berechneUmfang(float laenge, float breite) {
		return 2 * (laenge + breite);
	}

	public float berechneInhalt(float laenge, float breite) {
		return laenge * breite;
	}
}

 

Die Annotation @WebService

Als aller erstes schreibe ich über die Klasse die Annotation „@WebService“. Zusätzlich gebe ich folgende Parameter an:

  • name= „RechteckWebService“
    • Name des Web Service (muss man sich nicht unbedingt merken)
  • serviceName = „RechteckWebService“
    • Der Servicename des Web Service (Wichtig für das Build-File)
  • portName = „RechteckWebServicePort“
    • Der Portname des Web Service (Wichtig für das Build-File)
  • targetNamespace = „http://www.axxg.de/ws/rechteck“
    • theoretischer Namespace des Web Service (Wichtig für das Build-File) DIESER SOLLTE IMMER GLEICH BLEIBEN!
package main;

import javax.jws.WebService;

@WebService(name = "RechteckWebService",  serviceName = "RechteckWebService", portName = "RechteckWebServicePort", targetNamespace = "http://www.axxg.de/ws/rechteck")
public class RechteckService {

	public float berechneUmfang(float laenge, float breite) {
		return 2 * (laenge + breite);
	}

	public float berechneInhalt(float laenge, float breite) {
		return laenge * breite;
	}
}

 

Die build.xml (ANT)

Die Web Service-Klasse ist fertig. Nicht schön, aber das kann ich später noch ändern. Nun geht es um das Ant-Build-File. Folgende Parameter müssen angepasst werden:

  • project name=“RechteckWebService“ default=“release“ basedir=“.“
    • Name des Projektes z.B.: RechteckWebService
  • property name=“wsgen.exec“ value=“C:/Program Files (x86)/Java/jdk1.6.0_16/bin/wsgen“
    • Pfad zum WSGEN Tool – dieser Pfad hängt von dem Betriebssystem und der installierten Java Version ab!
  • param name=“portname“ value=“{http://www.axxg.de/ws/rechteck}RechteckWebServicePort“
    • Setzt sich aus dem Namespace und dem Portnamen zusammen – diese wurden oben in der Annotation @WebService angegeben!
  • param name=“servicename“ value=“{http://www.axxg.de/ws/rechteck}RechteckWebService“
    • Setzt sich aus dem Namespace und dem Servicename zusammen – diese wurden oben in der Annotation @WebService angegeben!
  • param name=“classname“ value=“main.RechteckService“
    • vollständiger Klassenname mit allen Packages!
<project name="RechteckWebService" default="release" basedir=".">
	<property name="jaxws-version" value="2.0" />
	<property name="jar.file" value="${ant.project.name}.jar"/>
	<property name="generated" value="generated" />
	<property name="generated.src" value="${generated}/src" />
	<property name="generated.wsdl" value="${generated}/wsdl" />
	<property name="classes.dir" value="bin" />
	<property name="wsgen.exec" value="C:/Program Files (x86)/Java/jdk1.6.0_16/bin/wsgen" />
		<target name="clean">
			<delete failonerror="false" includeemptydirs="true">
				<fileset dir="${generated.src}" />
				<fileset dir="${generated.wsdl}" />
				<fileset dir="release" />
			</delete>
			<mkdir dir="${generated}" />
			<mkdir dir="${generated.src}" />
			<mkdir dir="${generated.wsdl}" />
			<mkdir dir="release"/>
		</target>

	<target name="release" depends="clean, create-service, jar" />

	<target name="create-service">
		<antcall target="create-ws">
			<param name="portname" value="{http://www.axxg.de/ws/rechteck}RechteckWebServicePort" />
			<param name="servicename" value="{http://www.axxg.de/ws/rechteck}RechteckWebService" />
			<param name="classname" value="main.RechteckService" />
		</antcall>
	</target>
	
	<target name="jar">
		<jar destfile="release/${jar.file}">
			<zipfileset dir="${classes.dir}" includes="**/*.*" />
		</jar>
	</target>
	
	<target name="create-ws">
		<exec executable="${wsgen.exec}">
			<arg value="-wsdl" />
			<arg value="-keep" />
			<arg value="-classpath" />
			<arg value="${classes.dir}" />
			<arg value="-r" />
			<arg value="${generated.wsdl}" />
			<arg value="-s" />
			<arg value="${generated.src}" />
			<arg value="-d" />
			<arg value="${classes.dir}" />
			<arg value="-servicename" />
			<arg value="${servicename}" />
			<arg value="-portname" />
			<arg value="${portname}" />
			<arg value="${classname}" />
		</exec>
	</target>

</project>

Nun muss ich das Projekt nur noch bauen und …

…FERTIG!

 

Die Annotation @WebResult und @WebParam

Sollte man etwas mehr Zeit haben, empfehle ich noch die Annotationen @WebResult und @WebParam anzuwenden. Diese Annotationen definieren die Übergabeparameter und den Rückgabetyp genauer!

package main;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

@WebService(name = "RechteckWebService",  serviceName = "RechteckWebService", portName = "RechteckWebServicePort", targetNamespace = "http://www.axxg.de/ws/rechteck")
public class RechteckService {

	public  @WebResult(name= "Umfang") float berechneUmfang(
			@WebParam(name = "Laenge") float laenge, 
			@WebParam(name = "Breite") float breite) {
		return 2 * (laenge + breite);
	}

	public  @WebResult(name= "Flaecheninhalt")float berechneInhalt(
			@WebParam(name = "Laenge") float laenge, 
			@WebParam(name = "Breite") float breite) {
		return laenge * breite;
	}

}

 

Die generierte WSDL

RechteckWebService.wsdl

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Generated by JAX-WS RI at . RI's version is JAX-WS RI 2.1.6 in JDK 6. -->
<definitions targetNamespace="http://www.axxg.de/ws/rechteck" name="RechteckWebService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://www.axxg.de/ws/rechteck" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://www.axxg.de/ws/rechteck" schemaLocation="RechteckWebService_schema1.xsd"/>
    </xsd:schema>
  </types>
  <message name="berechneUmfang">
    <part name="parameters" element="tns:berechneUmfang"/>
  </message>
  <message name="berechneUmfangResponse">
    <part name="parameters" element="tns:berechneUmfangResponse"/>
  </message>
  <message name="berechneInhalt">
    <part name="parameters" element="tns:berechneInhalt"/>
  </message>
  <message name="berechneInhaltResponse">
    <part name="parameters" element="tns:berechneInhaltResponse"/>
  </message>
  <portType name="RechteckWebService">
    <operation name="berechneUmfang">
      <input message="tns:berechneUmfang"/>
      <output message="tns:berechneUmfangResponse"/>
    </operation>
    <operation name="berechneInhalt">
      <input message="tns:berechneInhalt"/>
      <output message="tns:berechneInhaltResponse"/>
    </operation>
  </portType>
  <binding name="RechteckWebServicePortBinding" type="tns:RechteckWebService">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="berechneUmfang">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
    <operation name="berechneInhalt">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="RechteckWebService">
    <port name="RechteckWebServicePort" binding="tns:RechteckWebServicePortBinding">
      <soap:address location="REPLACE_WITH_ACTUAL_URL"/>
    </port>
  </service>
</definitions>

RechteckWebService_schema1.xsd

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="http://www.axxg.de/ws/rechteck" xmlns:tns="http://www.axxg.de/ws/rechteck" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="berechneInhalt" type="tns:berechneInhalt"/>

  <xs:element name="berechneInhaltResponse" type="tns:berechneInhaltResponse"/>

  <xs:element name="berechneUmfang" type="tns:berechneUmfang"/>

  <xs:element name="berechneUmfangResponse" type="tns:berechneUmfangResponse"/>

  <xs:complexType name="berechneInhalt">
    <xs:sequence>
      <xs:element name="Laenge" type="xs:float"/>
      <xs:element name="Breite" type="xs:float"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="berechneInhaltResponse">
    <xs:sequence>
      <xs:element name="Flaecheninhalt" type="xs:float"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="berechneUmfang">
    <xs:sequence>
      <xs:element name="Laenge" type="xs:float"/>
      <xs:element name="Breite" type="xs:float"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="berechneUmfangResponse">
    <xs:sequence>
      <xs:element name="Umfang" type="xs:float"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

 

Beispiel

Web Service Quickstart

 

Jetzt habe ich einen Web Service und jetzt?

In einem weiteren Artikel (Java: …und in weiteren 20 Sekunden einen Web Service veröffentlichen/bereitstellen ohne Applikationserver!) habe ich beschrieben, wie man z.B. diesen Web Service ohne Applikationsserver veröffentlicht bzw bereitstellt. Außerdem brauch man noch einen Web Service Client:

…Wem das zu viel ist, dem sei SOAP UI zu empfehlen.

 

Quellen und weitere Informationen

 

Copyright © 2011 AxxG – Alexander Gräsel



5 Antworten : “Java: SOAP – Web Service in 15 Sekunden schreiben (Quickstart)”

  1. Lukas Frey sagt:

    Hallo Alexander

    Vielen dank für dieses Tutorial, das war genau, was ich suchte für einen „Quick-Start“.

    Lukas

  2. Sonny White sagt:

    Sehr tolle und schnelle Erklärung! Ich dachte bisher immer da steckt sonst was für Magie dahinter 🙂 … vielen Dank!

  3. Bernhard sagt:

    Echt super! 🙂
    Einzig wie man zur WSDL und zur XSD kommt bleibt mir ein Tätsel… Ich bin neu auf diesem Gebiet (habe früher viel Java programmiert) und kann nicht nachvollziehen, wie die WSDL generiert wird – kann mir da jemand auf die Sprünge helfen? 🙂

    • Hallo Bernhard,
      danke für das Lob^^

      Was mein Ant-Skript letztlich macht ist ein Programm namens „wsgen.exec“ aufzurufen.
      Diese Programm muss mit bestimmten Parametern gestartet werden und generiert dir die WSDL- und XSD-Dateien.

      Du kannst ja mal das Programm in einer normalen CMD öffnen;-)

Kommentar verfassen