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.