Sučelje upravljani kontroleri u proljeće

1. Uvod

U ovom uputstvu razmatramo novu značajku Spring MVC-a koja nam omogućuje određivanje web zahtjeva pomoću uobičajenih Java sučelja.

2. Pregled

Obično, prilikom definiranja kontrolera u Spring MVC-u, njegove metode ukrašavamo raznim bilješkama koje specificiraju zahtjev: URL krajnje točke, metodu HTTP zahtjeva, varijable puta itd.

Možemo, na primjer, predstaviti / save / {id} krajnja točka pomoću spomenutih bilješki na inače običnoj metodi:

@PostMapping ("/ save / {id}") @ResponseBody javno spremanje knjige (@RequestBody Book book, @PathVariable int id) {// implementacija}

Prirodno, to uopće nije problem kada imamo samo jedan kontroler koji obrađuje zahtjeve. Situacija se malo mijenja kada imamo razne kontrolere s potpisima iste metode.

Na primjer, mogli bismo imati dvije različite verzije kontrolera - zbog migracije ili slične - koje imaju iste potpise metode. U tom bismo slučaju imali znatnu količinu dupliciranih napomena koje prate definicije metode. Očito bi to kršilo SUHO (ne ponavljaj se) načelo.

Ako bi se takva situacija dogodila za čiste Java klase, jednostavno bismo definirali sučelje i natjerali klase da implementiraju ovo sučelje. U kontrolerima, glavno opterećenje metoda nije zbog potpisa metode, već zbog anotacija metode.

Proljeće 5.1 je ipak predstavilo novu značajku:

Bilješke parametara kontrolera otkrivaju se i na sučeljima: Omogućavanje potpunih ugovora o mapiranju u sučeljima kontrolera.

Istražimo kako možemo koristiti ovu značajku.

3. Sučelje kontrolera

3.1. Postavljanje konteksta

Novu značajku ilustriramo primjerom vrlo jednostavne REST aplikacije koja upravlja knjigama. Sastojat će se od samo jednog upravljača s metodama koje nam omogućuju preuzimanje i izmjenu knjiga.

U vodiču se koncentriramo samo na pitanja vezana uz značajku. Sva pitanja implementacije aplikacije mogu se naći u našem GitHub spremištu.

3.2. Sučelje

Definirajmo uobičajeno Java sučelje u kojem definiramo ne samo potpise metoda već i vrstu web zahtjeva s kojima bi trebali rukovati:

@RequestMapping ("/ default") javno sučelje BookOperations {@GetMapping ("/") Popis getAll (); @GetMapping ("/ {id}") Izborni getById (@PathVariable int id); @PostMapping ("/ save / {id}") javno void spremanje (@RequestBody Book book, @PathVariable int id); }

Primijetite da možemo imati napomene na razini klase, kao i one na razini metode. Sada možemo stvoriti kontroler koji implementira ovo sučelje:

@RestController @RequestMapping ("/ book") javna klasa BookController implementira BookOperations {@Override public List getAll () {...} @Override public Neobvezna getById (int id) {...} @Override public void save (Book book) , int id) {...}}

Ipak bismo trebali dodati bilješku na razini razreda @RestController ili @Controller našem kontroloru. Na ovaj način definiran kontroler nasljeđuje sve bilješke povezane s mapiranjem web zahtjeva.

Da bismo provjerili radi li kontroler sada kako se očekivalo, pokrenimo aplikaciju i pritisnite getAll () metoda podnošenjem odgovarajućeg zahtjeva:

uvojak // localhost: 8081 / knjiga /

Iako kontroler implementira sučelje, možemo ga dodatno prilagoditi dodavanjem bilješki web zahtjeva. To možemo učiniti na način kao što smo to učinili za sučelje: bilo na razini klase ili na razini metode. Zapravo smo koristili ovu mogućnost prilikom definiranja kontrolera:

@RequestMapping ("/ book") javna klasa BookController implementira BookOperations {...}

Ako nadzorniku dodamo bilješke s web zahtjevima, one će imati prednost nad onima na sučelju. Drugim riječima, Spring interpretira sučelja kontrolera na način sličan onome kako se Java bavi nasljeđivanjem.

U sučelju definiramo sva uobičajena svojstva web zahtjeva, no u upravljaču ih uvijek možemo fino prilagoditi.

3.3. Napomena

Kada imamo sučelje i razne kontrolere koji ga implementiraju, možemo doći u situaciju da se web zahtjevom može upravljati s više metoda. Naravno, proljeće će donijeti iznimku:

Uzrok: java.lang.IllegalStateException: Dvosmisleno mapiranje.

Ako ukrasimo kontroler sa @RequestMapping, možemo smanjiti rizik dvosmislenih preslikavanja.

4. Zaključak

U ovom uputstvu razmatrali smo novu značajku predstavljenu u proljeće 5.1. Sada, kada Spring MVC kontroleri implementiraju sučelje, oni to rade ne samo na standardni Java način već i nasljeđuju sve funkcionalnosti povezane s web zahtjevima definirane u sučelju.

Kao i uvijek, možda ćemo pronaći odgovarajuće isječke koda na našem GitHub spremištu.


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