Įvadas

Sukursime paprastą webservice projektą, kur bus Tomcat serveryje publikuotas webservice, kuris grąžins statinius duomenis.

Naudojam įrankiai:

  • Eclipse Luna (4.4.0);
  • Apache Maven 3.2.3;
  • Metro webservice stack 2.3;
  • Tomcat 7.0.55.

Maven projekto sukūrimas

Sukuriame naują Maven projektą. Pasirenkame, kad projektą kuriame nepasirinkdami archetipo.

Nurodome, group id lt.adnera.tutorials.webservice ir artifact id metro.tomcat. Taip pat nurodome, kad aplikaciją reikai supakuoti į war'ą:

Simple maven project creation 

Spaudžiame mygtuką "Finish" ir projektas sukuriamas.

Nurodome, kokia projekte bus naudojama Java versija. Tam einame į pom.xml failą ir įtraukiame maven-compiler-plugin ir nurodome, kad naudosime 1.7 Java versiją. Taip pat nurodome, kad bus naudojama UTF-8 koduotė.

Dabar pom.xml turėtų atrodyti taip:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>lt.adnera.tutorials.webservice</groupId>
	<artifactId>metro.tomcat</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

 

Atnaujiname Eclipse projekto informaciją. Tam Project Explorer lange atsistojame ant projekto ir iš kontekstinio meniu pasirenkame komandą Maven -> Update Project... Atsidariusiame lange patvirtiname projekto pasirinkimą.

Dabar Markers lange neturi likti klaidų.

Kadangi norodėme, kad mūsų aplikacija bus surenkama į war failą, t.y. web aplikaciją, kurioje bus galima publikuoti webservisą, sukuriame web.xml failą, kuris nurodys, kad tai internetinė aplikacija ir jame bus šios aplikacijos nustatymai. Tam src\main\webapp sukuriame naują direktoriją WEB-INF ir jame failą web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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/web-app_3_0.xsd">
	<display-name>Car rent integrations</display-name>
</web-app>

WSDL pridėjimas

Sukuriame direktoriją src/main/recources, kurioje saugosime wsdl failus ir į šią direktoriją įkeliame wsdl failą CarRentSystemService.wsdl.

<?xml version="1.0" encoding="UTF-8" ?>
<definitions targetNamespace="urn:CarRentSystemService"
	xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:CarRentSystemService"
	xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:crs="urn:lt.adnera.tutorials.carentsystem"
	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
	<types>
		<xsd:schema targetNamespace="urn:lt.adnera.tutorials.carentsystem"
			elementFormDefault="qualified">
			<xsd:complexType name="Car">
				<xsd:sequence>
					<xsd:element name="model" type="xsd:string" />
					<xsd:element name="mark" type="xsd:string" />
					<xsd:element name="seats" type="xsd:int" />
					<xsd:element name="doors" type="xsd:int" />
					<xsd:element name="transmisionType" type="xsd:string" />
					<xsd:element name="airConditioning" type="xsd:boolean" />
					<xsd:element name="bags" type="crs:Bags" />
				</xsd:sequence>
			</xsd:complexType>
			<xsd:complexType name="Bags">
				<xsd:sequence>
					<xsd:element name="large" type="xsd:int" />
					<xsd:element name="small" type="xsd:int" />
				</xsd:sequence>
			</xsd:complexType>
			<xsd:complexType name="AvailableCarsRequest">
				<xsd:sequence>
					<xsd:element name="dateFrom" type="xsd:date" />
					<xsd:element name="dateTo" type="xsd:date" />
				</xsd:sequence>
			</xsd:complexType>
			<xsd:complexType name="AvailableCarsResponse">
				<xsd:sequence>
					<xsd:element name="cars" type="crs:Car" minOccurs="0"
						maxOccurs="unbounded" />
				</xsd:sequence>
			</xsd:complexType>
			<xsd:element name="availableCarsRequest" type="crs:AvailableCarsRequest" />
			<xsd:element name="availableCarsResponse" type="crs:AvailableCarsResponse" />
		</xsd:schema>
	</types>
	<message name="searchAvailableCarsRequest">
		<part name="searchAvailableCarsRequest" element="crs:availableCarsRequest" />
	</message>
	<message name="searchAvailableCarsResponse">
		<part name="searchAvailableCarsResponse" element="crs:availableCarsResponse" />
	</message>
	<portType name="CarsRentPortType">
		<operation name="searchAvailableCars">
			<input message="tns:searchAvailableCarsRequest" />
			<output message="tns:searchAvailableCarsResponse" />
		</operation>
	</portType>
	<binding name="CarsRentPortTypeSOAP11Binding" type="tns:CarsRentPortType">
		<soap:binding style="document"
			transport="http://schemas.xmlsoap.org/soap/http" />
		<operation name="searchAvailableCars">
			<soap:operation style="document"
				soapAction="urn:CarRentSystemService/searchAvailableCars" />
			<input>
				<soap:body use="literal" parts="searchAvailableCarsRequest" />
			</input>
			<output>
				<soap:body use="literal" parts="searchAvailableCarsResponse" />
			</output>
		</operation>
	</binding>
	<service name="CarsRentService">
		<port name="carRentPort" binding="tns:CarsRentPortTypeSOAP11Binding">
			<soap:address location="http://www.example.com" />
		</port>
	</service>
</definitions>

Kodo generavimas iš WSDL ir jo pridėjimas Eclipse projekte

Pakoreguojame pom.xml, kad galėtume iš wsdl generuoti Java klases:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>lt.adnera.tutorials.webservice</groupId>
	<artifactId>metro.tomcat</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.jvnet.jax-ws-commons</groupId>
				<artifactId>jaxws-maven-plugin</artifactId>
				<version>2.3</version>
				<executions>
					<execution>
						<goals>
							<goal>wsimport</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<wsdlDirectory>src/main/resources/wsdl</wsdlDirectory>
					<wsdlFiles>
						<wsdlFile>CarRentSystemService.wsdl</wsdlFile>
					</wsdlFiles>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

Sugeneruojame Java klases iš esamo wsdl. Tam atsistojam ant pom.xml failo ir iš kontekstinio meniu pasirenkame komandą Run As -> Maven build. Atsidariusiame lange nurodome tikslą clean compile:

Sugeneruojamos Java klasės. Kad jos pilnai matytųsi per Eclipse, reikia atnaujinti struktūrą. Tam Project Explorer lange atsistojame ant projekto ir paspaudžiame klavišą F5.

Sugeneruotos klasės atsiranda direktorijoje target\generated-sources\wsimport\carentsystem\tutorials\adnera\lt

 

Matome, kad java klasių paketas sugeneruotas atvirkščiai nei yra namespace. Kaip tai sutvarkyti aptarsime kitoje pamokoje.

Dabar sukursime web serviso kodą, kuris grąžins rezultatus.

Kol kas sugeneruotos klasės nėra atpažįstamose Eclipse kaip programinis kodas. Nurodome, kad generuotas kodas būtų Eclipse priimtas kaip programinis. Tam pažymine projektą "Project Explorer" lange ir iš kontekstinio meniu pasirenkame "Properties". Atsidariusiame lange pasirenkame "Java Build Path" punktą ir "Source kortelę":

 Spaudžiame mygtuką "Add Folder..." ir atsidariusiame lange pažymime direktoriją targe/generate-sources/wsimport

Patvirtiname programinio kodo direktorijos pridėjimą "OK" paspaudimu.

Webservice realizacija

Sukuriame klasę lt.adnera.tutorials.carrentsystem.ws.impl.CarsRentPortTypeImpl kuri grąžins paprastą atsakymą susidendatį iš vieno automobilio nepriklausomai nuo perduodamų parametrų. 

package lt.adnera.tutorials.carrentsystem.ws.impl;

import javax.jws.WebService;

import carrentsystem.tutorials.adnera.lt.AvailableCarsRequest;
import carrentsystem.tutorials.adnera.lt.AvailableCarsResponse;
import carrentsystem.tutorials.adnera.lt.Car;
import carrentsystem.tutorials.adnera.lt.CarsRentPortType;

@WebService
public class CarsRentPortTypeImpl implements CarsRentPortType {

	@Override
	public AvailableCarsResponse searchAvailableCars(
			AvailableCarsRequest searchAvailableCarsRequest) {

		AvailableCarsResponse resp = new AvailableCarsResponse();

		Car car = new Car();
		car.setMark("BMW");
		car.setModel("320");
		car.setSeats(5);
		car.setDoors(4);
		car.setTransmisionType("Manual");

		resp.getCars().add(car);

		return resp;
	}
}

Yra dvi galimybės sukonfigūruoti web'inę webservice aplikaciją. Pirmoji pasinaudojant konfigūracija esančia XML failais, o antroji pasinaudojant anotacijomis Java klasėse. Pirmiausia aptarsime primąjį variantą.

Webservice pasinaudojant XML konfigūracija

Sukuriame webserice konfigūracinį failą src\main\webapp\WEB-INF\sun-jaxws.xm:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
	version="2.0">
	<endpoint name="IrbisPortType"
		implementation="lt.registrucentras.evap.varzytynes.ws.impl.IrbisPortTypeImpl"
		url-pattern="/irbis" />
</endpoints>

Papildome web.xml failą 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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/web-app_3_0.xsd">
	<display-name>Car rent integrations</display-name>
	<listener>
		<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
	</listener>
	<servlet>
		<servlet-name>carsrentws</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>carsrentws</servlet-name>
		<url-pattern>/carsrentws</url-pattern>
	</servlet-mapping>
</web-app>

Tomcat configūravimas darbui su Metro webservice

Metro galima atsisiųsti iš https://metro.java.net/ svetainės. Tarkime atsisiunčiame 2.3 versiją iš https://metro.java.net/2.3/ 

Tomcat šakninėje direktorijoje sukuriame direktoriją endorsed ir į ją kopijuojame

  • webservices-api.jar

Į Tomcat serverio lib direktoriją nukopijuojame failus iš Metro atsisiųsto archyvo:

  • webservices-extra.jar
  • webservices-extra-api.jar
  • webservices-rt.jar
  • webservices-tools.jar

Tai galima atlikti ir padinaudojus Metro pakete esančiu diegimo į Tomcat įrankiu.

Webservice aplikacijos paleidimas

Įdiegiame webservice aplikaciją į Tomcat serverį ir jį paleidžiame. Kaip sukonfigūruoti Tomcat Eclipse IDE ir pdridėti aplikaciją galima paskaityti straipsnyje Tomcat konfigūravimas Eclipse webservice aplikacija yra analogiška kaip web aplikacija, todėl jos diegimas toks pats.

Startuojame Tomcat serverį ir einame adresu http://localhost:8080/metro.tomcat/carsrentws?wsdl

Naršyklės lange turi atsidaryti webservice WSDL failas

 

 

Toliau

 Kaip sukonfigūruoti lifecycle-mapping-metadata.xml 

 

Klaidos

java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServletContextListener

Jei gauname klaidą:

SEVERE: Error configuring application listener of class com.sun.xml.ws.transport.http.servlet.WSServletContextListener
java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServletContextListener
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
	at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:530)
	at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:512)
	at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:139)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4907)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5490)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:744)

reikia patikrinti ar Tomcat serveryje yra įdiegti webservise jar failai. 

Comments powered by CComment