Java >> Java opplæring >  >> Java

Eksempel på JAX-WS-klient fra WSDL

I dette eksemplet viser vi hvordan du genererer en JAX-WS-klient fra en WSDL-fil.

1. Introduksjon

Webtjenester er programvareapplikasjoner som utveksler meldinger over internett. En netttjenesteklient sender en forespørsel og nettjenesteleverandøren returnerer et svar.

Generelt finnes det to typer nettjenester, SOAP-baserte og RESTful-baserte. I Java er spesifikasjonene som brukes for disse to typene tjenester henholdsvis JAX-WS og JAX-RS.

En WSDL-fil brukes til å beskrive en SOAP-basert webtjeneste. Den spesifiserer operasjonene til tjenesten, deres parametere og typer, og endepunktene som er tilgjengelige for å starte disse operasjonene.

Det er verktøy tilgjengelig for å generere den nødvendige stubbkoden som brukes for å lage server- og klientapplikasjoner. Disse verktøyene fungerer vanligvis ved å analysere en WSDL-fil.

Apache CXF er et rammeverk for å utvikle og kjøre nettjenester av typen JAX-WS og JAX-RS. Det er flere verktøy inkludert i Apache CXF-distribusjonen for å jobbe med WSDL-filer. Blant disse er følgende:

  • wsdl2java – godtar et WSDL-dokument som input og genererer kommentert Java-kode for å implementere en tjeneste eller klient.
  • wsdl2js – godtar et WSDL-dokument som input og genererer Javascript-kode for å implementere en tjeneste.
  • wsdl2service -genererer en WSDL-fil som inneholder en HTTP- eller JMS-tjenestedefinisjon fra et eksisterende WSDL-dokument som inneholder et bindingselement.

I dette eksemplet vil vi bruke wsdl2java verktøy for å generere stubbekode og en enkel webtjenesteklient som utnytter stubbkoden. Maven cxf-codegen-plugin vil bli brukt til å konfigurere og kjøre wsdl2java-verktøyet.

1.1 Verktøy som brukes i dette eksemplet

  • Eclipse IDE for Enterprise Java Developer 2018-12
  • Maven 3.3.9 (innebygd i Eclipse)
  • Spring Tools 4 – for Spring Boot
  • Tomcat 9.0

Spring Tools 4 for Spring Boot er et sett med plugins for Eclipse som støtter bygging og kjøring av Spring Boot-applikasjoner. Du kan legge til Spring Tools 4 til din eksisterende Eclipse-installasjon ved å gå til Eclipse Marketplace og søke etter "Spring Tools 4".

2. JAX-WS-klient fra WSDL Eksempel

2.1 Last ned arkivet

Begynn med å laste ned Client-WSDL zip-filen fra nedlastingsseksjonen og pakke den ut til en mappe du ønsker.

2.2 Opprett klientprosjektet

Deretter oppretter du et Maven-prosjekt for klientapplikasjonen.

  1. Velg Ny -> Annet... I «Velg en veiviser» vindu, velg Maven Project fra Maven-delen og c klikk på Neste.
  2. Velg “Opprett et enkelt prosjekt (hopp over arketypevalg)” og klikk Neste.
  3. Skriv inn en gruppe-ID og artefakt-ID. Velg "krukke" for Emballasje og et navn og en beskrivelse om ønskelig. Klikk Fullfør.

2.3 Kopier WSDL-filen

Opprett en mappe som heter wsdl under scr/main/resources . Kopier Quotes.wsdl-filen som ble trukket ut fra zip-filen og plasser den i wsdl mappe.

La oss ta en titt på Quote.wsdl-filen.Quote.wsdl

 
<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
	xmlns:tns="http://examples.javacodegeeks.com/"
	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
	xmlns:ns1="http://schemas.xmlsoap.org/soap/http"
	name="RandomQuoteService"
	targetNamespace="http://examples.javacodegeeks.com/">
	<wsdl:types>
		<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
			xmlns:tns="http://examples.javacodegeeks.com/"
			elementFormDefault="unqualified"
			targetNamespace="http://examples.javacodegeeks.com/" version="1.0">

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

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

			<xs:complexType name="getQuote">
				<xs:sequence />
			</xs:complexType>

			<xs:complexType name="getQuoteResponse">
				<xs:sequence>
					<xs:element minOccurs="0" name="return" type="xs:string" />
				</xs:sequence>
			</xs:complexType>

		</xs:schema>
	</wsdl:types>
	<wsdl:message name="getQuoteResponse">
		<wsdl:part element="tns:getQuoteResponse" name="parameters">
		</wsdl:part>
	</wsdl:message>
	<wsdl:message name="getQuote">
		<wsdl:part element="tns:getQuote" name="parameters">
		</wsdl:part>
	</wsdl:message>
	<wsdl:portType name="RandomQuote">
		<wsdl:operation name="getQuote">
			<wsdl:input message="tns:getQuote" name="getQuote">
			</wsdl:input>
			<wsdl:output message="tns:getQuoteResponse"
				name="getQuoteResponse">
			</wsdl:output>
		</wsdl:operation>
	</wsdl:portType>
	<wsdl:binding name="RandomQuoteServiceSoapBinding"
		type="tns:RandomQuote">
		<soap:binding style="document"
			transport="http://schemas.xmlsoap.org/soap/http" />
		<wsdl:operation name="getQuote">
			<soap:operation soapAction="" style="document" />
			<wsdl:input name="getQuote">
				<soap:body use="literal" />
			</wsdl:input>
			<wsdl:output name="getQuoteResponse">
				<soap:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
	</wsdl:binding>
	<wsdl:service name="RandomQuoteService">
		<wsdl:port binding="tns:RandomQuoteServiceSoapBinding"
			name="RandomQuotePort">
			<soap:address
				location="http://localhost:8080/soapservice/services/quoteService" />
		</wsdl:port>
	</wsdl:service>
</wsdl:definitions>

WSDL-filen beskriver en enkel webtjeneste med én operasjon (getQuote) som returnerer en streng og én port (RandomQuote) konfigurert for HTTP-protokollen. Tjenesteendepunktet er satt til http://localhost:8080/soapservice/services/quoteService selv om dette kan konfigureres under kjøring av webtjenesteimplementatoren.

2.4 Legg til Maven CXF-kodegenereringsplugin

Åpne pom.xml fil og legg til Maven cxf-codegen-plugin.pom.xml

<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>com.javacodegeeks.examples</groupId>
	<artifactId>soapclient</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.cxf</groupId>
				<artifactId>cxf-codegen-plugin</artifactId>
				<version>3.2.7</version>
				<executions>
					<execution>
						<id>generate-sources</id>
						<phase>generate-sources</phase>
						<configuration>
							<sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
							<wsdlOptions>
								<wsdlOption>
									<wsdl>${basedir}/src/main/resources/wsdl/Quotes.wsdl</wsdl>
									<wsdlLocation>classpath:wsdl/Quotes.wsdl</wsdlLocation>
									<extraargs>
										<extraarg>-client</extraarg>
									</extraargs>
								</wsdlOption>
							</wsdlOptions>
						</configuration>
						<goals>
							<goal>wsdl2java</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

Som navnet tilsier, genererer Maven CXF-kodegen-plugin kode. Den vil kjøre CXF-kommandolinjeverktøy gjennom Maven-mål. Her spesifiserer vi at wsdl2java verktøyet skal utføres. Vi spesifiserer også at det skal kjøres under Maven generere-kilder fase. Utdatakatalogen for de genererte klassene er spesifisert med -elementet.

Verktøyet wsdl2java krever i det minste plasseringen av WSDL-filen som et argument. Dette er spesifisert med -elementet inne i -elementet. Vi inkluderer -elementet og prefikser plasseringen med classpath: slik at de genererte klassene bruker denne verdien i stedet for den absolutte banen til WSDL-filen i filsystemet.

Ytterligere alternativer kan spesifiseres ved å bruke -elementet. Vi instruerer wsdl2java til å bruke -klienten alternativet, som vil generere en enkel Java-klient. For en liste over andre wsdl2java-alternativer, besøk CXF Apache-dokumentasjonen her.

Plugin-konfigurasjonen bruker to Maven-egenskaper:

  • ${basedir} – representerer rotmappen til prosjektet.
  • ${project.build.directory} – refererer til målmappen, som er standard for Maven-genererte artefakter.

Når du lagrer filen, vises wsdl2java målet vil bli utført som en del av generer-kildene fase og følgende Java-klasser vil bli generert i target/generated/cxf katalog:

  • GetQuote.java
  • GetQuoteResponse.java
  • ObjectFactory.java
  • pakke-info.java
  • RandomQuote_RandomQuotePort_Client.java
  • RandomQuote.java
  • RandomQuoteService.java

Du kan kjøre Maven> Update Project... for å fjerne feilen.

2.5 Den genererte klientapplikasjonen

Åpne RandomQuote_RandomQuotePort_Client.java for å se koden.RandomQuote_RandomQuotePort_Client.java

package com.javacodegeeks.examples;

/**
 * Please modify this class to meet your needs
 * This class is not complete
 */

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

/**
 * This class was generated by Apache CXF 3.2.7
 * 2019-02-10T13:05:02.753-08:00
 * Generated source version: 3.2.7
 *
 */
public final class RandomQuote_RandomQuotePort_Client {

    private static final QName SERVICE_NAME = new QName("http://examples.javacodegeeks.com/", "RandomQuoteService");

    private RandomQuote_RandomQuotePort_Client() {
    }

    public static void main(String args[]) throws java.lang.Exception {
        URL wsdlURL = RandomQuoteService.WSDL_LOCATION;
        if (args.length > 0 && args[0] != null && !"".equals(args[0])) {
            File wsdlFile = new File(args[0]);
            try {
                if (wsdlFile.exists()) {
                    wsdlURL = wsdlFile.toURI().toURL();
                } else {
                    wsdlURL = new URL(args[0]);
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }

        RandomQuoteService ss = new RandomQuoteService(wsdlURL, SERVICE_NAME);
        RandomQuote port = ss.getRandomQuotePort();

        {
        System.out.println("Invoking getQuote...");
        java.lang.String _getQuote__return = port.getQuote();
        System.out.println("getQuote.result=" + _getQuote__return);


        }

        System.exit(0);
    }

}

Hovedmetoden bruker URL-en fra den genererte RandomQuoteService klasse. (RandomQuoteService slår opp WSDL-URLen fra klassebanen.) Du kan overstyre denne virkemåten ved å overføre plasseringen til WSDL som et argument til klientapplikasjonen.

Tjenesteklassen instansieres ved hjelp av RandomQuoteService(URL wsdlLocation, QName serviceName) konstruktør. Deretter hentes tjenesteendepunktgrensesnittet (SEI) fra tjenesten med et anrop til getRandomQuotePort() . Til slutt, getQuote() operasjonen påkalles og svaret skrives ut til konsollen.

2.6 Importer webtjenesteprosjektet

Klikk Fil -> Importer... og velg Prosjekter fra mappe eller arkiv . Klikk Neste .

Klikk på Arkiv... og velg soapwebservice.zip-filen fra mappen der arkivet ble trukket ut. Velg Eclipse-prosjektet fra listen og klikk Fullfør .

2.7 Start nettjenesten

Høyreklikk på soapwebservice prosjekt i Project Explorer og velg Kjør som> Spring Boot App .Spring Boot App Output

 
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.2.RELEASE)

2019-02-11 16:33:08.480  INFO 2352 --- [           main] c.j.e.soap.SoapwebserviceApplication     : Starting SoapwebserviceApplication on Gilbert-THINK with PID 2352 (C:\Users\Gilbert\workspaces\examples\soapwebservice\target\classes started by Gilbert in C:\Users\Gilbert\workspaces\examples\soapwebservice)
2019-02-11 16:33:08.486  INFO 2352 --- [           main] c.j.e.soap.SoapwebserviceApplication     : No active profile set, falling back to default profiles: default
2019-02-11 16:33:11.022  INFO 2352 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-02-11 16:33:11.053  INFO 2352 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-02-11 16:33:11.053  INFO 2352 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.14]
2019-02-11 16:33:11.061  INFO 2352 --- [           main] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jdk1.8.0_161\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Java/jdk1.8.0_11/bin/../jre/bin/server;C:/Java/jdk1.8.0_11/bin/../jre/bin;C:/Java/jdk1.8.0_11/bin/../jre/lib/amd64;C:\Program Files (x86)\Intel\iCLS Client\;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\IBM\WebSphere MQ\java\lib;C:\Program Files (x86)\IBM\WebSphere MQ\java\lib64;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\PROGRA~2\IBM\SQLLIB\BIN;C:\PROGRA~2\IBM\SQLLIB\FUNCTION;C:\PROGRA~2\IBM\SQLLIB\SAMPLES\REPL;C:\Java\jdk1.8.0_11\bin;C:\Program Files (x86)\IBM\WebSphere\AppServer\bin;C:\Program Files (x86)\IBM\WebSphere MQ\bin64;C:\Program Files (x86)\IBM\WebSphere MQ\bin;C:\Program Files (x86)\IBM\WebSphere MQ\tools\c\samples\bin;C:\Program Files\Lenovo\Fingerprint Manager Pro\;C:\Program Files (x86)\Common Files\lenovo\easyplussdk\bin;C:\Program Files (x86)\Lenovo\Access Connections\;C:\OpenShift;C:\Program Files\apache-maven-3.5.2\bin;C:\Program Files (x86)\Intel\UCRT\;C:\Program Files\Intel\UCRT\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Git\cmd;C:\Program Files\PuTTY\;C:\Program Files (x86)\Brackets\command;C:\apache2\bin;C:\lighttpd;C:\Program Files\SourceGear\Common\DiffMerge\;C:\Ruby24-x64\bin;C:\Users\Gilbert\AppData\Local\atom\bin;C:\Users\Gilbert\Desktop;;.]
2019-02-11 16:33:11.188  INFO 2352 --- [           main] o.a.c.c.C.[.[localhost].[/soapservice]   : Initializing Spring embedded WebApplicationContext
2019-02-11 16:33:11.189  INFO 2352 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2592 ms
2019-02-11 16:33:11.904  INFO 2352 --- [           main] o.a.c.w.s.f.ReflectionServiceFactoryBean : Creating Service {http://soap.examples.javacodegeeks.com/}RandomQuoteImplService from class com.javacodegeeks.examples.RandomQuote
2019-02-11 16:33:12.790  INFO 2352 --- [           main] org.apache.cxf.endpoint.ServerImpl       : Setting the server's publish address to be /quoteService
2019-02-11 16:33:13.178  INFO 2352 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-02-11 16:33:13.537  INFO 2352 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path '/soapservice'
2019-02-11 16:33:13.542  INFO 2352 --- [           main] c.j.e.soap.SoapwebserviceApplication     : Started SoapwebserviceApplication in 6.112 seconds (JVM running for 7.745)

2.8 Kjør klientapplikasjonen

Høyreklikk RandomQuote_RandomQuotePort_Client og velg Kjør som -> Java-applikasjon . Du vil se et vellykket svar i konsollen.Web Service Client Output

 
Invoking getQuote...
getQuote.result=I think therefore I am

3. JAX-WS-klient fra WSDL – Sammendrag

I dette innlegget demonstrerte vi hvordan du genererer en webtjenesteklient ved å bruke wsdl2java-verktøyet og Maven CXF-kodegen-plugin.

4. Last ned kildekoden

Dette var en JAX-WS-klient fra WSDL Eksempel.

Java Tag