Jarný editor vlastných vlastností
1. Úvod
Jednoducho povedané, Spring na správu konverzií medzi nimi intenzívne využíva editory nehnuteľností String hodnoty a zvyk Objekt typy; toto je založené na Java Beans PropertyEditor.
V tomto výučbe si ukážeme dva rôzne prípady použitia na demonštráciu automatická väzba editora vlastností a vlastná väzba editora vlastností.
2. Automatické viazanie editora vlastností
Štandardné JavaBeans infraštruktúra automaticky objaví PropertyEditor triedy, ak sú v rovnakom balíku ako trieda, s ktorou narábajú. Tiež musia mať rovnaký názov ako táto trieda a navyše Editor prípona.
Napríklad, ak vytvoríme a Kreditná karta trieda modelu, potom by sme mali pomenovať triedu editora CreditCardEditor.
Poďme teraz na to praktický príklad viazania vlastností.
V našom scenári odovzdáme číslo kreditnej karty ako premennú cesty v adrese URL žiadosti a túto hodnotu zviažeme ako kreditná karta objekt.
Najprv vytvorme Kreditná karta polia definujúce triedu modelu rawCardNumber, Bankové identifikačné číslo (prvých 6 číslic), číslo účtu (číslice od 7 do 15) a šekový kód (posledná číslica):
verejná trieda CreditCard {private String rawCardNumber; súkromné celé číslo bankIdNo; súkromné celé čísloČíslo; private Integer checkCode; // štandardný konštruktor, getre, setre}
Ďalej vytvoríme CreditCardEditor trieda. Týmto sa implementuje obchodná logika pre prevod čísla kreditnej karty uvedeného ako a String do a Kreditná karta objekt.
Trieda editora vlastností by sa mala rozšíriť PropertyEditorSupport a implementovať getAsText () a setAsText () metódy:
public class CreditCardEditor rozširuje PropertyEditorSupport {@Override public String getAsText () {CreditCardreditCard = (CreditCard) getValue (); vrátiť kreditnú kartu == null? "": creditCard.getRawCardNumber (); } @Override public void setAsText (textový reťazec) hodí IllegalArgumentException {if (StringUtils.isEmpty (text)) {setValue (null); } else {CreditCard creditCard = nová CreditCard (); creditCard.setRawCardNumber (text); Reťazec cardNo = text.replaceAll ("-", ""); if (cardNo.length ()! = 16) throw new IllegalArgumentException ("Formát kreditnej karty by mal byť xxxx-xxxx-xxxx-xxxx"); skúsiť {creditCard.setBankIdNo (Integer.valueOf (cardNo.substring (0, 6))); creditCard.setAccountNo (Integer.valueOf (cardNo.substring (6, cardNo.length () - 1)))); creditCard.setCheckCode (Integer.valueOf (cardNo.substring (cardNo.length () - 1))); } catch (NumberFormatException nfe) {throw new IllegalArgumentException (nfe); } setValue (creditCard); }}}
The getAsText () metóda sa volá pri serializácii objektu na a Reťazec, zatiaľ čo setAsText () sa používa na prevod a String k inému objektu.
Pretože sú tieto triedy umiestnené v rovnakom balíku, nemusíme pre viazanie robiť nič iné Editor pre typ Kreditná karta.
Teraz to môžeme vystaviť ako zdroj v rozhraní REST API; operácia vezme číslo kreditnej karty ako premennú cesty požiadavky a Spring spojí túto textovú hodnotu ako a CrediCard objekt a odovzdať ako argument metódy:
@GetMapping (value = "/ credit-card / {card-no}", produce = MediaType.APPLICATION_JSON_UTF8_VALUE) public CreditCard parseCreditCardNumber (@PathVariable ("card-no") CreditCard creditCard) {návratová kreditná karta; }
Napríklad pre vzorovú adresu URL žiadosti / editor nehnuteľností / kreditná karta / 1234-1234-1111-0019, dostaneme odpoveď:
{"rawCardNumber": "1234-1234-1111-0011", "bankIdNo": 123412, "accountNo": 341111001, "checkCode": 9}
3. Viazanie editora vlastných vlastností
Ak v rovnakom balíku alebo s očakávanými konvenciami pomenovania nemáme požadovanú triedu typu a triedu editora vlastností, budeme musieť definovať vlastnú väzbu medzi požadovaným typom a editorom vlastností.
V našom záväznom scenári editora vlastných vlastností a String hodnota bude odovzdaná v URL ako premenná cesty a my túto hodnotu zviažeme ako ExoticType objekt, ktorý iba uchováva hodnotu ako atribút.
Rovnako ako v časti 2, poďme si najskôr vytvoriť triedu modelu ExoticType:
verejná trieda ExoticType {súkromné meno reťazca; // štandardný konštruktor, getre, setre}
A naša trieda editora vlastných vlastností CustomExoticTypeEditor ktorý sa opäť rozširuje PropertyEditorSupport:
verejná trieda CustomExoticTypeEditor rozširuje PropertyEditorSupport {@Override verejný reťazec getAsText () {ExoticType exotickýType = (ExoticType) getValue (); vrátiť exotický typ == null? "": exoticType.getName (); } @Override public void setAsText (textový reťazec) hodí IllegalArgumentException {ExoticType exotickýType = nový ExoticType (); exoticType.setName (text.toUpperCase ()); setValue (exotickýTyp); }}
Pretože Spring nedokáže zistiť editor vlastností, budeme potrebovať metódu s poznámkou @InitBinder v našom Kontrolór trieda, ktorá zaregistruje editora:
@InitBinder public void initBinder (väzba WebDataBinder) {binder.registerCustomEditor (ExoticType.class, nový CustomExoticTypeEditor ()); }
Potom môžeme viazať vstup používateľa ExoticType objekt:
@GetMapping (hodnota = "/ exotický-typ / {hodnota}", produkuje = MediaType.APPLICATION_JSON_UTF8_VALUE) verejný ExoticType parseExoticType (@PathVariable ("hodnota") ExoticType exotický typ) {návrat exotický typ; }
Pre vzorovú adresu URL žiadosti / editor nehnuteľností / exotický typ / mučenka, dostaneme vzorovú odpoveď:
{"name": "VÁŠEŇ-OVOCIE"}
4. Záver
V tomto rýchlom článku sme sa dozvedeli, ako by sme mohli použiť automatické a vlastné viazanie editora vlastností na prevod čitateľného pre človeka String hodnoty na zložité typy Javy.
Celý zdrojový kód našich príkladov je tu ako vždy na GitHubu.