Uvod u JAX-WS
1. Pregled
Java API za XML web usluge (JAX-WS) standardizirani je API za stvaranje i upotrebu SOAP (Simple Object Access Protocol) web usluga.
U ovom ćemo članku stvoriti SOAP web uslugu i povezati se s njom pomoću JAX-WS.
2. SAPUN
SOAP je XML specifikacija za slanje poruka putem mreže. SOAP poruke neovisne su o bilo kojem operativnom sustavu i mogu koristiti razne komunikacijske protokole, uključujući HTTP i SMTP.
SOAP je težak XML, stoga se najbolje koristi s alatima / okvirima. JAX-WS je okvir koji pojednostavljuje upotrebu SOAP-a. Dio je standardne Jave.
3. Odozgo prema dolje prema dnu
Postoje dva načina izgradnje SOAP web usluga. Možemo ići s pristupom odozgo prema dolje ili odozdo prema gore.
U pristupu od vrha prema dolje (prvo prema ugovoru) kreira se WSDL dokument, a potrebne se Java klase generiraju iz WSDL-a. U pristupu odozdo prema gore (zadnji ugovor) Java klase se zapisuju, a WSDL generira iz Java klasa.
Pisanje WSDL datoteke može biti prilično teško, ovisno o tome koliko je složena vaša web usluga. To pristup odozdo prema gore čini lakšom opcijom. S druge strane, budući da se vaš WSDL generira iz Java klasa, svaka promjena koda može uzrokovati promjenu WSDL-a. To nije slučaj za pristup od vrha prema dolje.
U ovom ćemo članku pogledati oba pristupa.
4. Jezik definicije web usluga (WSDL)
WSDL je ugovorna definicija dostupnih usluga. To je specifikacija ulaznih / izlaznih poruka i kako pozvati web uslugu. Jezično je neutralan i definiran je u XML-u.
Pogledajmo glavne elemente WSDL dokumenta.
4.1. Definicije
The definicije element je korijenski element svih WSDL dokumenata. Definira naziv, prostor imena itd. Usluge i, kao što vidite, može biti prilično prostran:
...
4.2. Vrste
The vrste element definira vrste podataka koje koristi web usluga. WSDL koristi XSD (XML Schema Definition) kao sustav tipa koji pomaže u interoperabilnosti:
... ...
4.3. Poruke
The poruka element daje apstraktnu definiciju podataka koji se prenose. Svaki poruka element opisuje ulaz ili izlaz metode usluge i moguće iznimke:
... ...
4.4. Operacije i tipovi luka
The portType element opisuje svaki operacija koje se mogu izvesti i sve poruka uključeni elementi. Na primjer, getEfficiee operacija određuje zahtjev ulazni, izlaz i moguće kvar iznimka koju je izbacila web usluga operacija:
... .... ...
4.5. Vezovi
The vezivanje element pruža detalje o protokolu i formatu podataka za svaku portType:
... ... ...
4.6. Usluge i luke
The servis element definira priključke podržane od web usluge. The luka element u servis definira Ime, vezivanje i adresa usluge:
... ...
5. Pristup od vrha prema dolje (prvo-ugovor)
Počnimo s pristupom od vrha prema dolje stvaranjem WSDL datoteke zaposlenikservicetopdown.wsdl. Radi jednostavnosti, ima samo jednu metodu:
5.1. Generiranje Izvorne datoteke web usluga iz WSDL-a
Postoji nekoliko načina za generiranje izvornih datoteka web usluga iz WSDL dokumenta.
Jedan od načina je korištenje wsimport alat koji je dio JDK (na $ JAVA_HOME / bin) do JDK 8.
Iz naredbenog retka:
wsimport -s. -p com.baeldung.jaxws.server.topdown staffservicetopdown.wsdl
Korištene opcije naredbenog retka: -str određuje ciljni paket. -s određuje gdje smjestiti generirane izvorne datoteke.
Za kasnije verzije JDK možemo koristiti jaxws-maven-dodatak MojoHaus kako je ovdje opisano.
Alternativno, org.jvnet.jaxb2‘S maven-jaxb2-dodatak može vam dobro doći, kao što je detaljno opisano u Pozivanje SOAP web usluge na proljeće.
Generirane datoteke:
- EmployeeServiceTopDown.java - je sučelje krajnje točke usluge (SEI) koje sadrži definicije metoda
- ObjectFactory.java - sadrži tvorničke metode za programsko stvaranje primjera klasa izvedenih iz sheme
- EmployeeServiceTopDown_Service.java - je klasa davatelja usluga koju može koristiti JAX-WS klijent
5.2. Sučelje krajnje točke web usluge
The wsimport alat generirao je sučelje krajnje točke web usluge EmployeeServiceTopDown. Izjavljuje metode web usluga:
@WebService (name = "EmployeeServiceTopDown" targetNamespace = "//topdown.server.jaxws.baeldung.com/") @SOAPBinding (parameterStyle = SOAPBinding.ParameterStyle.BARE) @XmlSeeAlso ({ObjectFactory.class}) javnog sučelja EmployeeServiceTopDown { @WebMethod (action = "//topdown.server.jaxws.baeldung.com/" + "EmployeeServiceTopDown / countEfficiees") @WebResult (name = "countEfficieesResponse", targetNamespace = "//topdown.server.jaxws.baeldung.com/ ", partName =" parametri ") public int countE Employees (); }
5.3. Implementacija web usluga
The wsimport alat stvorio strukturu web usluge. Moramo stvoriti implementaciju web usluge:
@WebService (name = "EmployeeServiceTopDown", endpointInterface = "com.baeldung.jaxws.server.topdown.EfficieeServiceTopDown", targetNamespace = "//topdown.server.jaxws.baeldung.com/") javna klasa EmployeeServiceTopDoVeeSoviceTopDownSoviceTopDownToDovice privatni EmployeeRepository workerRepositoryImpl; @WebMethod public int countEfficiees () {return workerRepositoryImpl.count (); }}
6. Pristup odozdo prema gore (posljednji ugovor)
U pristupu odozdo prema gore moramo stvoriti i sučelje krajnje točke i klase implementacije. WSDL se generira iz klasa kada se web usluga objavi.
Stvorimo web uslugu koja će izvoditi jednostavne CRUD operacije Zaposlenik podaci.
6.1. Model Model
The Zaposlenik klasa modela:
zaposlenik u javnoj klasi {private int id; private String firstName; // standardni geteri i postavljači}
6.2. Sučelje krajnje točke web usluge
Sučelje krajnje točke web usluge koje deklarira metode web usluge:
@WebService javno sučelje EmployeeService {@WebMethod Employee getEfficiee (int id); @WebMethod Employee updateE Employee (int id, naziv niza); @WebMethod boolean deleteEfficiee (int id); @WebMethod Zaposlenik addEfficiee (int id, naziv niza); // ...}
Ovo sučelje definira apstraktni ugovor za web uslugu. Korištene bilješke:
- @WebService označava da je to sučelje web usluge
- @WebMethod koristi se za prilagodbu rada web usluga
- @WebResult koristi se za prilagođavanje imena XML elementa koji predstavlja povratnu vrijednost
6.3. Implementacija web usluga
Klasa implementacije sučelja krajnje točke web usluge:
@WebService (endpointInterface = "com.baeldung.jaxws.EfficieeService") javna klasa EmployeeServiceImpl provodi EmployeeService {@Inject private EmployeeRepository workerRepositoryImpl; @WebMethod public Employee getEfficiee (int id) {return workerRepositoryImpl.getEfficiee (id); } @WebMethod public Employee updateE Employee (int id, String name) {return workerRepositoryImpl.updateEfficiee (id, ime); } @WebMethod public boolean deleteEfficiee (int id) {return workerRepositoryImpl.deleteEfficiee (id); } @WebMethod public Employee addEfficiee (int id, String name) {return workerRepositoryImpl.addEfficiee (id, ime); } // ...}
7. Objavljivanje krajnjih točaka web usluga
Da bismo objavili web usluge (odozgo prema dolje i odozdo prema gore), trebamo proslijediti adresu i primjerak implementacije web usluge objaviti() metoda javax.xml.ws.Endpoint razred:
javna klasa EmployeeServicePublisher {javna statička void glavna (String [] args) {Endpoint.publish ("// localhost: 8080 / workerservicetopdown", new EmployeeServiceTopDownImpl ()); Endpoint.publish ("// localhost: 8080 / workerservice", novi EmployeeServiceImpl ()); }}
Sad možemo trčati EmployeeServicePublisher za pokretanje web usluge. Da bi se koristile značajke CDI-ja, web usluge mogu se rasporediti kao WAR datoteka na poslužitelje aplikacija poput WildFly ili GlassFish.
8. Klijent udaljene web usluge
Stvorimo sada JAX-WS klijenta za povezivanje s Usluga zaposlenika web usluga na daljinu.
8.1. Generiranje artefakata klijenta
Da bismo generirali artefakte JAX-WS klijenta, možemo ponovno koristiti wsimport alat:
wsimport -keep -p com.baeldung.jaxws.client // localhost: 8080 / workerservice? wsdl
Stvoreno EmployeeService_Service class enkapsulira logiku za dobivanje poslužiteljskog porta URL i QName.
8.2. Povezivanje s web uslugom
Klijent web usluge koristi generirano EmployeeService_Service za povezivanje s poslužiteljem i daljinsko pozivanje web usluga:
javna klasa EmployeeServiceClient {public static void main (String [] args) baca iznimku {URL url = novi URL ("// localhost: 8080 / workerservice? wsdl"); EmployeeService_Service workerService_Service = nova EmployeeService_Service (url); EmployeeService workerServiceProxy = workerService_Service.getEfficieeServiceImplPort (); Navedi sveEfficiees = workerServiceProxy.getAllEfficiees (); }}
9. Zaključak
Ovaj je članak brzi uvod u SOAP web usluge pomoću JAX-WS.
Koristili smo pristupe odozdo prema gore i odozgo prema dolje za stvaranje SOAP web usluga koristeći JAX-WS API. Također smo napisali JAX-WS klijent koji se može daljinski povezati s poslužiteljem i pozivati web usluge.
Kompletni izvorni kod dostupan je na GitHubu.