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.