2

Od WSDL k webovej službe — generovanie servera a klienta pomocou Metro na Java 1...

 1 year ago
source link: https://novotnyr.github.io/scrolls/od-wsdl-k-webovej-sluzbe-metro-pre-java-17/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Od WSDL k webovej službe — generovanie servera a klienta pomocou Metro na Java 17

Od WSDL k webovej službe — generovanie servera a klienta pomocou Metro na Java 17

2022/10/30

Navrhli sme webovú službu pre SOAP pomocou contract-first? Máme teda kontrakt reprezentovaný súborom WSDL?

Poďme vygenerovať kód pre server SOAP na kombinácii:

  • Java 17

  • špecifikáciu Jakarta XML Web Services 4.0 (nástupca JAX-WS)

  • referenčnú implementáciu Eclipse Metro.

  • plugin pre Maven z knižnice Eclipse Metro.

Príklad a štruktúra dát

Vybudujme si službu pre objednanie parkovania. V požiadavke pošleme EČV vozidla a parkovaciu zónu a v odpovedi získame identifikátor parkovacieho lístka a dátum platnosti.

Pripravíme si:

  • schému pre správy v tvare XSD (XML Schema)

  • popisný súbor WSDL

  • mavenovský projekt s pom.xml pre serverovskú časť.

XML schéma

Vezmeme schému pre správy pomocou XML Schemy.

Kompletný súbor schémy parking.xsd nájdeme na konci článku, resp. v repozitári na GitHube.

WSDL súbor

Vezmeme si hotový súbor pre WSDL.

Kompletný súbor schémy parking.wsdl nájdeme na konci článku, resp. v repozitári na GitHube.

Projekt pre serverovskú časť

Založme si nový projekt založený na buildovacom nástroji Maven.

V pom.xml definujeme:

  • verziu kódu pre kompilátor: použijeme Javu 17

  • závislosť na knižnici Eclipse Metro

  • Maven plugin pre generovanie kódu servera

Verzia kompilátora

Dodajme nasledovné projektové vlastnosti:

pom.xml

Závislosť na knižnici Metro

Pridajme si závislosť na knižnici Metro:

pom.xml

Maven Plugin

Generovanie kostry serverovskej časti projektu, teda generovanie zdrojových kódov podľa dodaného WSDL súboru uskutočníme cez mavenovský plugin.

pom.xml
1 Definujme odkaz na názov WSDL, z ktorého vygenerujeme kód.
2 Uvedieme cestu k adresáru v projekte, z ktorého vytiahneme WSDL súbor.
3 Aby sa v generovanom kóde zbytočne neobjavovali celé cesty k lokálnemu súborovému systému používateľa, uveďme explicitnú adresu ku kódu.

Ak umiestnime WSDL súbor medzi prostriedky (resources), objaví sa vo výslednom JAR archíve a teda v ceste CLASSPATH (v koreni). Takto sa na tento súbor odkážeme z bežiaceho servera a vieme ho poskytnúť klientovi.

Lokácia wsdlLocation s lomkou na začiatku znamená, že WSDL súbor pri budovaní klientskeho kódu sa vytiahne z cesty CLASSPATH.

Celý pom.xml

Celý súbor pom.xml nájdeme na na GitHube.

Rozmiestnenie súborov

Oba súbory — parking.wsdl aj parking.xsd umiestnime do src/main/resources, pretože tak sme to nastavili v pom.xml v adresári wsdlDirectory.

Zostavenie projektu

Zdrojáky pre server nagenerujeme nasledovne:

Ak spúšťame Maven zo shellu, dajme si pozor, aby Java, v ktorej sa spúšťal Maven, bola vo verzii 17.

Zdrojáky sa nagenerujú do priečinka:

target/generated-sources/wsimport/

Pre naše WSDL sa vygeneruje nasledovná štruktúra:

Názvy priečinkov / balíčkov sa odvodia z targetNamespace vo WSDL či schéme.

Konfigurácia projektu

Adresár target/generated-sources/wsimport/ je užitočné potrebné pridať do projektu ako miesto so zdrojovými kódmi.

Eclipse

Pravý klik na adresár v strome Package List, a z kontextového menu Build Path | Use as Source Folder.

IntelliJ

Pravý klik na adresár target/generated-sources-wsimport v projektovom strome, a z kontextového menu Mark Directory As | Generated Sources Root.

Implementácia servera

Implementácia servera znamená vytvorenie triedy, ktorá bude implementovať triedu org.example.ParkingService.

DefaultParkingService.java
1 Implementujeme interfejs, ktorý vznikol generovaním kódu.
2 V atribúte endpointInterface uvedieme interfejs s kontraktom webovej služby pre JAX-WS.
3 Pripravíme implementáciu metódy — v tomto prípade veľmi jednoduchú.

Interfejs ParkingService sa uvádza na dvoch miestach:

  1. V implements, kde určuje metódy, ktoré v Jave naprogramujeme.

  2. V endpointInterface, kde spárujeme implementáciu s nagenerovaným kontraktom webovej služby.

Ak vynecháme atribút endpointInterface, môže sa stať, že server nageneruje kontrakt a WSDL na základe implementácie — teda „v protismere“ od kódu k WSDL, čo rozhodne nechceme!

Spustenie servera

Server môžeme spustiť jednoducho:

ParkingSoapServer.java

Server beží na porte 8888 a spĺňa špecifikáciu WSDL.

Táto služba zverejňuje WSDL na adrese http://localhost:8888/parking?wsdl. Toto WSDL je však autogenerované, čo popiera zmysel ručnej tvorby.

Spustenie servera s naším WSDL

Ak chceme použiť existujúce WSDL a to zverejniť klientovi, musíme prispôsobiť nasadenie služby.

Budeme predpokladať, že v CLASSPATH máme aj WSDL (parking.wsdl) aj XSD (parking.xsd).

1 Musíme si pripraviť zoznam pre metadáta: teda WSDL a XSD.
2 Vytvoríme objekt Source reprezentujúci XML súbor pre WSDL či schému. Tento objekt načítame z CLASSPATH: to je reprezentované lomkou v argumente getResourceAsStream.
3 Každý takýto objekt Source potrebuje jednoznačný identifikátor v tvare URL s použitím protokolu HTTP alebo file. Keďže na konkrétnej hodnote nezáleží, vytvoríme si vymyslený ukážkový identifikátor.
4 Súbor dodáme do metadát.
5 Pomocou properties definujeme filter na službu service a port z WSDL, na ktorý použijeme naše metadáta, teda na ktorom zmeníme WSDL a XML schému XSD. Pomocou WSDL_SERVICE určíme kvalifikované meno (menný priestor a názov elementu) pre element wsdl:service z WSDL.
6 Pomocou WSDL_PORT určíme kvalifikované meno (menný priestor a názov elementu) pre element wsdl:port z WSDL.
7 Vytvoríme nový endpoint nad našou triedou s implementáciou servera.
8 Nastavíme filter cez properties.
9 Nastavíme nové metadáta služby.
10 Endpoint vypublikujeme na danej adrese.

Backend teraz môžeme spustiť ako Java aplikáciu!

Na adrese http://localhost:8888/parking?wsdl uvidíme našej ručne písané WSDL!

Pri deklarovaní filtra (properties) sa musia kvalifikované názvy presne zhodovať s názvami vo WSDL.

  • Menný priestor v kvalifikovanom mene QName sa preberá z atribútu targetNamespace vo WSDL.

  • Lokálne meno z atribútu name v elemente wsdl:service, resp. wsdl:port.

Výsledný repozitár

Výsledný repozitár je na GitHube, v repozitári novotnyr/jaxws-wsdl-server-2022.

Zdrojáky

XML Schéma

parking.xsd
parking.wsdl

Deskriptor pre Maven

pom.xml

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK