Uvod u funkcionalni mrežni okvir u proljeće 5

1. Uvod

Spring WebFlux novi je funkcionalni web okvir izgrađen koristeći reaktivne principe.

U ovom uputstvu naučit ćemo kako s njim raditi u praksi.

To ćemo temeljiti na našem postojećem vodiču za Spring 5 WebFlux. U tom smo vodiču stvorili jednostavnu reaktivnu REST aplikaciju pomoću komponenata temeljenih na bilješkama. Ovdje ćemo umjesto toga koristiti funkcionalni okvir.

2. Ovisnost Mavena

I nama će trebati isto spring-boot-starter-webflux ovisnost kako je definirana u prethodnom članku:

 org.springframework.boot spring-boot-starter-webflux 2.2.6.OSLOBODI 

3. Funkcionalni web okvir

Funkcionalni web okvir uvodi novi model programiranja gdje koristimo funkcije za usmjeravanje i obradu zahtjeva.

Za razliku od modela temeljenog na bilješkama gdje koristimo mapiranje bilješki, ovdje ćemo koristiti HandlerFunction i Funkcija usmjerivačas.

Slično tome, kao i kod komentiranih kontrolera, pristup funkcionalnim krajnjim točkama izgrađen je na istom reaktivnom stogu.

3.1. HandlerFunction

The HandlerFunction predstavlja funkciju koja generira odgovore na zahtjeve usmjerene na njih:

@FunctionalInterface javno sučelje HandlerFunction {Mono handle (zahtjev za ServerRequest); }

Ovo sučelje je prvenstveno a Funkcija, koji se ponaša vrlo poput servleta.

Iako, u usporedbi sa standardom Servlet # service (ServletRequest req, ServletResponse res), HandlerFunction ne uzima odgovor kao ulazni parametar.

3.2. Funkcija usmjerivača

Funkcija usmjerivača služi kao alternativa za @RequestMapping bilješka. Možemo ga koristiti za usmjeravanje zahtjeva na funkcije rukovatelja:

@FunctionalInterface javno sučelje RouterFunction {Mono ruta (zahtjev za ServerRequest); // ...}

Tipično možemo uvesti pomoćnu funkciju RouterFunctions.route () za stvaranje ruta, umjesto da napišete kompletnu funkciju usmjerivača.

Omogućuje nam usmjeravanje zahtjeva primjenom a ZahtjevPrediciraj. Kada se podudara predikat, vraća se drugi argument, funkcija obrađivača:

javna statička ruta RouterFunction (predikat RequestPredicate, HandlerFunction handlerFunction)

Jer ruta () metoda vraća a Funkcija usmjerivača, možemo ga povezati za izgradnju moćnih i složenih shema usmjeravanja.

4. Reactive REST aplikacija koja koristi funkcijski web

U našem prethodnom vodiču stvorili smo jednostavan Upravljanje zaposlenicima REST aplikacija pomoću @RestController i WebClient.

Sada, implementirajmo istu logiku koristeći funkcije usmjerivača i rukovatelja.

Prvi, moramo stvoriti rute koristeći Funkcija usmjerivača objaviti i konzumirati naše reaktivne tokove Zaposleniks.

Rute su registrirane kao proljetni grah i mogu se stvoriti unutar bilo koje klase konfiguracije.

4.1. Pojedinačni resurs

Stvorimo svoju prvu rutu koristeći Funkcija usmjerivača koji objavljuje singl Zaposlenik resurs:

@Bean RouterFunction getEfficieeByIdRoute () {return route (GET ("/ zaposlenici / {id}"), req -> ok (). Body (workerRepository (). FindEfficieeById (req.pathVariable ("id")), Employee.class )); }

Prvi argument je predikat zahtjeva. Primijetite kako smo koristili statički uvezeni RequestPredicates.GET metoda ovdje. Drugi parametar definira funkciju rukovatelja koja će se koristiti ako se primjenjuje predikat.

Drugim riječima, gornji primjer usmjerava sve GET zahtjeve za / zaposlenici / {id} do Spremište EmployeeRepository # findEfficieeById (ID niza) metoda.

4.2. Resurs za prikupljanje

Dalje, za objavljivanje resursa zbirke, dodajte još jedan put:

@Bean RouterFunction getAllEfficieesRoute () {return route (GET ("/ zaposlenici"), req -> ok (). Body (workerRepository (). FindAllEfficiees (), Employee.class)); }

4.3. Ažuriranje jednog resursa

Na kraju, dodajmo rutu za ažuriranje Zaposlenik resurs:

@Bean RouterFunction updateEfficieeRoute () {povratna ruta (POST ("/ zaposlenici / ažuriranje"), req -> req.body (toMono (Employee.class)) .doOnNext (workerRepository () :: updateEfficiee) .tada (ok () .izgraditi())); }

5. Sastavljanje ruta

Rute također možemo sastaviti zajedno u jednoj funkciji usmjerivača.

Pogledajmo kako kombinirati gore stvorene rute:

@Bean RouterFunction sastavljenRoutes () {return route (GET ("/ zaposlenici"), req -> ok (). Body (workerRepository (). FindAllEfficiees (), Employee.class)) .and (route (GET ("/ zaposlenici / {id} "), req -> ok (). body (workerRepository (). findEfficieeById (req.pathVariable (" id ")), Employee.class))) .and (route (POST (" / zaposlenici / ažuriranje) "), req -> req.body (toMono (Employee.class)) .doOnNext (workerRepository () :: updateEfficiee). then (ok (). build ()))); }

Evo, koristili smo RouterFunction.and () kombinirati naše rute.

Konačno, implementirali smo kompletan REST API potreban za naš Upravljanje zaposlenicima aplikacija, koristeći usmjerivače i rukovatelje.

Za pokretanje aplikacije možemo koristiti zasebne rute ili onu jedinstvenu, sastavljenu koju smo gore stvorili.

6. Rute ispitivanja

Možemo koristiti WebTestClient da testiramo naše rute.

Da bismo to učinili, prvo moramo povezati rute pomoću bindToRouterFunction metodu, a zatim izgradite testnu instancu klijenta.

Isprobajmo svoje getEfficieeByIdRoute:

@Test javna praznina givenEfficieeId_whenGetEfficieeById_thenCorrectEfficiee () {WebTestClient client = WebTestClient .bindToRouterFunction (config.getEfficieeByIdRoute ()) .build (); Zaposlenik zaposlenik = novi zaposlenik ("1", "Zaposlenik 1"); dana (workerRepository.findEfficieeById ("1")). willReturn (Mono.just (zaposlenik)); client.get () .uri ("/ zaposlenici / 1") .exchange () .expectStatus () .isOk () .expectBody (Employee.class) .isEqualTo (zaposlenik); }

i slično getAllEfficieesRoute:

@Test public void whenGetAllEfficiees_thenCorrectEfficiees () {WebTestClient client = WebTestClient .bindToRouterFunction (config.getAllEfficieesRoute ()) .build (); Popis zaposlenika = Arrays.asList (novi zaposlenik ("1", "zaposlenik 1"), novi zaposlenik ("2", "zaposlenik 2")); Flux zaposlenikFlux = Flux.fromIterable (zaposlenici); dano (workerRepository.findAllEfficiees ()). willReturn (workerFlux); client.get () .uri ("/ zaposlenici") .exchange () .expectStatus () .isOk () .expectBodyList (Employee.class) .isEqualTo (zaposlenici); }

Također možemo testirati svoje updateEfficieeRoute tvrdeći da je naš Zaposlenik instanca se ažurira putem Spremište zaposlenika:

@Test javna praznina whenUpdateEfficiee_thenEfficieeUpdated () {WebTestClient client = WebTestClient .bindToRouterFunction (config.updateEfficieeRoute ()) .build (); Zaposlenik zaposlenik = novi zaposlenik ("1", "Zaposlenik 1 ažuriran"); client.post () .uri ("/ zaposlenici / ažuriranje") .body (Mono.just (zaposlenik), Employee.class) .exchange () .expectStatus () .isOk (); verify (workerRepository) .updateE Employee (zaposlenik); }

Za više detalja o testiranju s WebTestClient molimo pogledajte naš vodič o radu s WebClient i WebTestClient.

7. Sažetak

U ovom smo tutoriju predstavili novi funkcionalni web okvir u proljeće 5 i pogledali njegova dva temeljna sučelja - Funkcija usmjerivača i HandlerFunction. Također smo naučili kako stvoriti razne rute za obradu zahtjeva i slanje odgovora.

Uz to smo ponovno stvorili naš Upravljanje zaposlenicima aplikacija predstavljena u vodiču za Spring 5 WebFlux s modelom funkcionalnih krajnjih točaka.

Kao i uvijek, puni izvorni kod možete pronaći na Githubu.


$config[zx-auto] not found$config[zx-overlay] not found