Projekt Entwicklung verteilter Softwaresysteme mit Web Services SoSe2008 - Java API for XML Web Service (JAX-WS) - 07. April 2008 Verteilte Systeme und Informationssysteme (VSIS) Department Informatik Universität Hamburg Einführung Java API for XML Web Service (JAX-WS) Java API zum Erstellen von Webservices Nachfolger von JAX-RPC - aktuelle Version: JAX-WS 2.1 Referenzimplementierung im Projekt Glassfish (JAX-WS RI) Verwendung von Annotationen zur Vereinfachung der Entwicklung und des Deployments von Webservice Clients und Service Endpunkten Tools zum Generieren von sog. Portable Artifacts und XML-Artefakten Laufzeitumgebung High-Level-API: Abstrakte Sicht auf Webservices ohne Details von SOAP, XML, usw. möglich Low-Level-API: Zugriff auf (XML-) Nachrichtenebene möglich Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 2 1
JAX-WS Programmiermodell: High Level API Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 3 Architekturübersicht Serverseitige Implementierung Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 4 2
Programmiermodell High-Level-API Serverseitige Implementierung Bottom-up: 1. Implementierung des Service-Endpoint Interfaces (SEI) 2. Generieren von Portable Artifacts (WSDL, XSD) aus dem SEI (Tool: wsgen) 3. Deployment als.war-archiv Top-down: 1. Beschreibung des Webservices als WSDL-Datei 2. Generieren von Portable Artifacts (Proxy-Klassen) aus WSDL und XSD (Tool: wsimport) 3. Implementierung des Service-Endpoint Interfaces (SEI) 4. Deployment als.war-archiv Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 5 Beispiel TestClient.java TestService.java - String dosometestoperation (TestObject to){ - TestService.wsdl - TestObject.xsd <testobject> <name>horst</name> <testobject> Answer Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 6 3
Programmiermodell High-Level-API Serverseitige Implementierung Beispiel <?xml version="1.0" encoding="utf-8"?> <wsdl:definitions name="testservice" targetnamespace="http://test.vsis.org" xmlns:tns="http://test.vsis.org" xmlns:t=http://testobject.vsis.org xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl=http://schemas.xmlsoap.org/wsdl/ xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/xmlschema"> <wsdl:types> <xsd:schema targetnamespace="http://test.vsis.org" > <xsd:import namespace="http://testobject.vsis.org" schemalocation="test.xsd"/> <xsd:element name="answer" type="xsd:string" /> </xsd:schema> </wsdl:types> <wsdl:message name="inmessage"> <wsdl:part name="testobject" element="t:testobject" /> </wsdl:message> <wsdl:message name="outmessage"> <wsdl:part name="answer" element="tns:answer" /> </wsdl:message>.. TestService.wsdl Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 7 Programmiermodell High-Level-API Serverseitige Implementierung Beispiel TestService.wsdl <wsdl:porttype name="testserviceporttype"> <wsdl:operation name="dosometestoperation" > <wsdl:input message="tns:inmessage" /> <wsdl:output message="tns:outmessage" /> </wsdl:operation> </wsdl:porttype> <wsdl:binding name="testservicehttpbinding" type="tns:testserviceporttype"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="dosometestoperation"> <wsdlsoap:operation soapaction=""/> <wsdl:input> <wsdlsoap:body use="literal" /> </wsdl:input> <wsdl:output> <wsdlsoap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding>. Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 8 4
Programmiermodell High-Level-API Serverseitige Implementierung Beispiel TestService.wsdl <wsdl:service name="testservice"> <wsdl:port binding="tns:testservicehttpbinding" name="testserviceport"> <wsdlsoap:address location="http://someserver/test/testservice"/> </wsdl:port> </wsdl:service> </wsdl:definitions> Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 9 Programmiermodell High-Level-API Serverseitige Implementierung XML Binding JAX-B: Java API for XML Binding Umwandlung von XML-Datentypen in Java-konforme Datentypen // Provide the namespace, otherwise it defaults to the package name @XmlRootElement(namespace="http://testobject.vsis.org") public class TestObject { TestObject.xsd private String name; <?xml version="1.0" encoding="utf-8"?> public String getname() { return name; public void setname(string value) { name = value; TestObject.java <xsd:schema targetnamespace="http://testobject.vsis.org" xmlns="http://testobject.vsis.org" xmlns:xsd="http://www.w3.org/2001/xmlschema"> <xsd:element name="testobject"> <xsd:complextype > <xsd:sequence> <xsd:element name="name" type="xsd:string" </xsd:sequence> </xsd:complextype> </xsd:element> </xsd:schema> Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 10 5
Programmiermodell High-Level-API Serverseitige Implementierung XML Binding ObjectFactory @XmlRegistry public class ObjectFactory { public TestObject createtestobject() { return new TestObject(); Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 11 Programmiermodell High-Level-API Serverseitige Implementierung Beispiel eines Service-Endpoint Interfaces @WebService( name="testservice", targetnamespace="http://test.vsis.org", servicename="testservice", portname="testserviceport", wsdllocation="web-inf/wsdl/testservice.wsdl" ) @SOAPBinding(parameterStyle=SOAPBinding.ParameterStyle.BARE) public class UserRegistrationService { @WebResult(name="answer") public String dosometestoperation(testobject to) { return new String("Test: " + to.getname()); Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 12 6
Architekturübersicht Clientseitige Implementierung Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 13 Programmiermodell High-Level-API Clientseitige Implementierung Dispatch: Aufrufen von Webdiensten ohne typsicheren Proxy Dynamic Proxy: 1. Generieren von Portable Artifacts aus einer WSDL-Beschreibung (Tool: wsimport) 2. Verwenden der generierten Proxy-Klassen zum Aufrufen des Webservices von einem beliebigen Endpunkt - Erzeuge Dienst - Hole Port-Proxy - Rufe Aktion im Port-Proxy auf Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 14 7
Programmiermodell High-Level-API Clientseitige Implementierung mit Dynamic Proxy -- Beispiel public class TestClient { @WebServiceRef(wsdlLocation="http://someServer/Test/TestService?wsdl") static TestService service; public void dosomething() { // Create a Dynamic Proxy client service = new TestService(); TestServicePortType port = service.gettestserviceport(); // Use Proxy Instance as BindingProvider BindingProvider bp = (BindingProvider) port; // (Optional) Configure RequestContext with endpoint's URL Map<String, Object> rc = bp.getrequestcontext(); rc.put (BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://someothertestserver/testservice"); TestObject to = new TestObject(); to.setname("horst"); String response = port. dosometestoperation(to) ; System.out.println(response); Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 15 JAX-WS Programmiermodell: Low Level API Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 16 8
Ausblick: Low Level APIs Aufbereitung und Zugriff auf Nachricht/Daten Annotierung per @WebServiceProvider und Implementierung von Provider<Source>, Provider<SOAPMessage> oder Provider<DataSource> Zugriff auf gesamte Nachricht oder Payload per Annotation: @ServiceMode.MESSAGE oder @ServiceMode. PAYLOAD Beispiel: Zugriff auf gesamten SOAP-Request @WebServiceProvider @ServiceMode(value=Service.Mode.MESSAGE) public class ProviderImpl implements Provider<SOAPMessage> { public SOAPMessage invoke(soapmessage msg) { // do request processing SOAPMessage response =...; return response; Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 17 Ausblick: Erweiterungen Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 18 9
Deployment Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 19 Deployment-Deskriptoren Konfiguration von Web-Applikationen allgemein: web.xml http://java.sun.com/products/servlet/reference/api/index.html für JAX-WS Webservices: sun-jaxws.xml https://java.sun.com/webservices/docs/2.0/jaxws/jaxws-war.html serverspezifisch: hier sun-web.xml http://docs.sun.com/app/docs/doc/819-3660/6n5s7klpg?a=view Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 20 10
Deployment-Deskriptoren: web.xml Beispiel web.xml <?xml version="1.0"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/webapp_2_5.xsd"> <!-- JAXWS Servlet Enddpoint --> <listener> <listener-class>com.sun.xml.ws.transport.http.servlet.wsservletcontextlistener</listener-class> </listener> <servlet> <servlet-name>wsservlet</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.wsservlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>wsservlet</servlet-name> <url-pattern>/webservices/*</url-pattern> </servlet-mapping> </web-app> Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 21 Beispiel sun-jaxws.xml Deployment-Deskriptoren: sun-jaxws.xml <?xml version="1.0" encoding="utf-8"?> <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <endpoint name="testservice" implementation="org.vsis.testservice" url-pattern="/testservice"/> </endpoints> Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 22 11
Beispiel sun-web.xml <?xml version="1.0"?> <sun-web-app> Deployment-Deskriptoren: sun-web.xml <context-root>test</context-root> <servlet> <servlet-name>testservice</servlet-name> <webservice-endpoint> <port-component-name>testservice</port-component-name> <endpoint-address-uri>/testservice</endpoint-address-uri> <servlet-impl-class>org.vsis.testservice</servlet-impl-class> </webservice-endpoint> </servlet> </sun-web-app> Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 23 Ant Werkzeug für die Automatisierung von Build- und Deploy-Vorgängen Steuerung über XML-Datei ("build.xml") Typische "Targets": build, create-war, clean build: Kompilieren und Zusammenfügen mit statischen Inhalten create-war: Erstellen einer installationsfertigen.war-datei clean: Entfernen der Produkte von build und deploy http://ant.apache.org/manual/index.html Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 24 12
JAX-WS Tools mit Ant JAX-WS-Tools: apt: Verarbeitung der Annotationen wsgen: Generieren von XML-Artefakten wie WSDL und XML-Schemata wsimport: Generieren von Portable Artefacts (Port, Service Endpoint Interface, JAX-B-Mapper-Klassen) aus einer WSDL-Datei <target name="generate-client" depends="setup"> <wsimport debug="true" verbose="${verbose" keep="true" destdir="${basedir/src" package="org.vsis.client" wsdl="http://someserver/test/testservice?wsdl"> </wsimport> </target> Beispiel: wsimport mit Ant (build.xml) Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 25 Gesamte Struktur einer Web-Applikation.war-Datei: /build/dist/ Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 26 13
Deployment und Ausführung Admin-Konsole auf http://vsisls4:2xx10 Applikationen laufen auf http://vsisls4:2xx00/context-root Webservices laufen auf http://vsisls4:2xx00/context-root/servicename WSDL ist abrufbar auf http://vsisls4:2xx00/context-root/servicename?wsdl Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 27 Ende des Vorlesungsteils Viel Erfolg! Projekt: Entwicklung verteilter Softwaresysteme mit Web Services 28 14