Rozhranie riadené radiče na jar

1. Úvod

V tomto tutoriáli uvažujeme o novej funkcii Spring MVC, ktorá nám umožňuje špecifikovať webové požiadavky pomocou obvyklých rozhraní Java.

2. Prehľad

Zvyčajne pri definovaní radiča v Spring MVC zdobíme jeho metódy rôznymi anotáciami, ktoré špecifikujú požiadavku: URL koncového bodu, metóda požiadavky HTTP, premenné cesty atď.

Môžeme napríklad predstaviť / save / {id} koncový bod používajúci uvedené anotácie na inak obyčajnej metóde:

@PostMapping ("/ save / {id}") @ResponseBody verejná kniha uložiť (kniha @RequestBody Book, @PathVariable int id) {// implementácia}

Prirodzene to nie je vôbec problém, keď máme iba jeden radič, ktorý vybavuje žiadosti. Situácia sa trochu zmení, keď máme rôzne radiče s rovnakými podpismi metód.

Napríklad môžeme mať dve rôzne verzie radiča - z dôvodu migrácie alebo podobného -, ktoré majú rovnaké podpisy metód. V takom prípade by sme mali k dispozícii značné množstvo duplicitných anotácií, ktoré sprevádzajú definície metód. Je zrejmé, že by to porušilo DRY (neopakuj sa) princíp.

Ak by táto situácia nastala pre čisté triedy Java, jednoducho by sme definovali rozhranie a nechali by tieto triedy implementovať. V radičoch hlavné zaťaženie metód nie je spôsobené podpismi metód, ale anotáciami metódy.

Jar 5.1 však predstavila novú funkciu:

Anotácie parametrov radiča sa zistia aj na rozhraniach: Umožňujú úplné mapovanie kontraktov v rozhraniach radiča.

Poďme preskúmať, ako môžeme túto funkciu využiť.

3. Rozhranie radiča

3.1. Kontextové nastavenie

Novú funkciu ilustrujeme na príklade veľmi jednoduchej aplikácie REST, ktorá spravuje knihy. Bude pozostávať iba z jedného radiča s metódami, ktoré nám umožnia načítať a upravovať knihy.

V tejto príručke sa zameriavame iba na problémy súvisiace s touto funkciou. Všetky problémy s implementáciou aplikácie nájdete v našom úložisku GitHub.

3.2. Rozhranie

Definujme obvyklé rozhranie Java, v ktorom definujeme nielen podpisy metód, ale aj typ webových požiadaviek, ktoré majú spracovávať:

@RequestMapping ("/ default") verejné rozhranie BookOperations {@GetMapping ("/") List getAll (); @GetMapping ("/ {id}") Voliteľné getById (@PathVariable int id); @PostMapping ("/ save / {id}") public void save (kniha knihy @RequestBody, @PathVariable int id); }

Všimnite si, že môžeme mať anotácie na úrovni triedy aj na úrovni metód. Teraz môžeme vytvoriť radič, ktorý implementuje toto rozhranie:

@RestController @RequestMapping ("/ book") verejná trieda BookController implementuje BookOperations {@Override public List getAll () {...} @Override public Optional getById (int id) {...} @Override public void save (kniha) , int id) {...}}

Stále by sme mali pridať anotáciu na úrovni triedy @RestController alebo @ Kontrolór nášmu kontrolórovi. Takto definované, ovládač dedí všetky anotácie súvisiace s mapovaním webových požiadaviek.

Aby sme skontrolovali, či ovládač teraz funguje podľa očakávaní, spustime aplikáciu a stlačte kláves získať všetko() príslušnou požiadavkou:

zvlnenie // localhost: 8081 / kniha /

Aj keď radič implementuje rozhranie, môžeme ho ešte doladiť pridaním anotácií webových požiadaviek. Môžeme to urobiť spôsobom, ako sme to urobili pre rozhranie: buď na úrovni triedy alebo na úrovni metódy. Túto možnosť sme v skutočnosti použili pri definovaní radiča:

@RequestMapping ("/ book") verejná trieda BookController implementuje BookOperations {...}

Ak do radiča pridáme anotácie webových požiadaviek, budú mať prednosť pred anotáciami rozhrania. Inými slovami, Jar interpretuje rozhrania radiča podobným spôsobom, ako sa Java správa s dedičstvom.

V rozhraní definujeme všetky bežné vlastnosti webových požiadaviek, ale v ovládači ich môžeme vždy doladiť.

3.3. Upozornenie

Keď máme rozhranie a rôzne radiče, ktoré ho implementujú, môžeme sa dostať do situácie, keď bude možné webovú požiadavku vybaviť viac ako jednou metódou. Jar samozrejme spôsobí výnimku:

Spôsobené: java.lang.IllegalStateException: nejednoznačné mapovanie.

Ak ovládač ozdobíme @RequestMapping, môžeme znížiť riziko nejednoznačných zobrazení.

4. Záver

V tomto tutoriáli sme uvažovali o novej funkcii predstavenej na jar 5.1. Teraz, keď radiče Spring MVC implementujú rozhranie, robia to nielen štandardným spôsobom Java, ale dedia aj všetky funkcie súvisiace s webovými požiadavkami definované v rozhraní.

Ako vždy, zodpovedajúce útržky kódu nájdeme v našom úložisku GitHub.


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