Tavaszi egyedi tulajdon szerkesztő

1. Bemutatkozás

Egyszerűen fogalmazva, a Spring nagyban használja az ingatlanszerkesztőket a közötti konverzió kezelésére Húr értékek és szokások Tárgy típusok; ez a Java Beans PropertyEditoron alapul.

Ebben az oktatóanyagban két különböző felhasználási esetet fogunk áttekinteni automatikus tulajdonságszerkesztő és egyedi tulajdonságszerkesztő kötés.

2. Automatikus tulajdonságszerkesztő kötése

Alapértelmezett JavaBeans az infrastruktúra automatikusan felfedezi PropertyEditor osztályok, ha ugyanabban a csomagban vannak, mint az általuk kezelt osztály. Ezeknek ugyanazoknak a neveknek kell lenniük, mint az osztály és a Szerkesztő utótag.

Például, ha létrehozunk egy Hitelkártya modell osztály, akkor nevezzük meg a szerkesztő osztályt CreditCardEditor.

Most menjünk át gyakorlati tulajdonságkötési példa.

A mi esetünkben hitelkártyaszámot adunk meg útváltozóként a kérelem URL-jében, és ezt az értéket mint hitelkártya tárgy.

Először hozzuk létre a Hitelkártya modellosztály meghatározó mezők rawCardNumber, Banki azonosító szám (az első 6 számjegy), Számlaszám (7 és 15 közötti számjegy) és Ellenőrző kód (utolsó számjegy):

public class CreditCard {private String rawCardNumber; magán Integer bankIdNo; privát egész számla nincs; privát egész szám ellenőrző kód; // szabványos kivitelező, mérőeszközök, beállítók}

Ezután létrehozzuk a CreditCardEditor osztály. Ez megvalósítja az üzleti logikát a hitelkártya szám konvertálásához Húr a Hitelkártya tárgy.

A tulajdonságszerkesztő osztálynak ki kell terjednie PropertyEditorSupport és végrehajtja a getAsText () és setAsText () mód:

a public class CreditCardEditor kiterjeszti a PropertyEditorSupport {@Orride public String getAsText () {CreditCard creditCard = (CreditCard) getValue (); return creditCard == null? "": creditCard.getRawCardNumber (); } @Orride public void setAsText (String text) az IllegalArgumentException {if (StringUtils.isEmpty (text)) {setValue (null); } else {CreditCard creditCard = új CreditCard (); creditCard.setRawCardNumber (szöveg); String cardNo = text.replaceAll ("-", ""); if (cardNo.length ()! = 16) dobjon új IllegalArgumentException-t ("A hitelkártya formátuma xxxx-xxxx-xxxx-xxxx legyen"); próbáld ki a {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) {új IllegalArgumentException (nfe) dobása; } setValue (creditCard); }}}

A getAsText () metódust hívjuk meg, amikor egy objektumot sorosítunk a Húr, míg setAsText () a konvertálására szolgál Húr egy másik tárgyra.

Mivel ezek az osztályok ugyanabban a csomagban találhatók, nem kell mást tennünk a kötéshez Szerkesztő típushoz Hitelkártya.

Ezt most erőforrásként tehetjük közzé egy REST API-ban; a művelet hitelkártyaszámot vesz fel kérési útváltozóként, és a Spring ezt a szöveges értéket a-ként fogja megkötni CrediCard objektumot és metódus argumentumként adja át:

@GetMapping (value = "/ hitelkártya / {kártya-no}", = MediaType.APPLICATION_JSON_UTF8_VALUE) nyilvános CreditCard parseCreditCardNumber (@PathVariable ("card-no") CreditCard creditCard) {return creditCard; }

Például egy minta kérés URL-hez / property-editor / hitelkártya / 1234-1234-1111-0019, megkapjuk a választ:

{"rawCardNumber": "1234-1234-1111-0011", "bankIdNo": 123412, "accountNo": 341111001, "checkCode": 9}

3. Egyedi tulajdonságszerkesztő kötése

Ha nincs meg a szükséges típusú osztály és a tulajdonságszerkesztő osztály ugyanabban a csomagban, vagy a várható elnevezési szokásokkal, akkor egyedi kötést kell megadnunk a szükséges típus és a tulajdonságszerkesztő között.

Egyéni tulajdonságszerkesztő kötelező forgatókönyvünkben a Húr érték átkerül az URL-ben elérési útváltozóként, és ezt az értéket mi kötjük ExoticType objektum, amely csupán megtartja az értéket attribútumként.

A 2. szakaszhoz hasonlóan először hozzunk létre egy modellosztályt ExoticType:

public class ExoticType {private String name; // szabványos kivitelező, mérőeszközök, beállítók}

És az egyedi tulajdonságszerkesztő osztályunk CustomExoticTypeEditor ami ismét kiterjed PropertyEditorSupport:

public class CustomExoticTypeEditor kiterjeszti a PropertyEditorSupport {@Orride public String getAsText () {ExoticType exoticType = (ExoticType) getValue (); return exoticType == null? "": exoticType.getName (); } @Orride public void setAsText (karakterlánc szöveg) az IllegalArgumentException {ExoticType exoticType = new ExoticType (); exoticType.setName (text.toUpperCase ()); setValue (exoticType); }}

Mivel Spring nem tudja észlelni az ingatlanszerkesztőt, Szükségünk lesz egy módszerrel, amelyhez jegyzetet fűzünk @InitBinder miénkben Vezérlő osztály, amely regisztrálja a szerkesztőt:

@InitBinder public void initBinder (WebDataBinder iratgyűjtő) {binder.registerCustomEditor (ExoticType.class, új CustomExoticTypeEditor ()); }

Ezután a felhasználói adatbevitelt leköthetjük ExoticType tárgy:

@GetMapping (value = "/ exotic-type / {value}", = = MediaType.APPLICATION_JSON_UTF8_VALUE) public ExoticType parseExoticType (@PathVariable ("value") ExoticType exoticType) {return exoticType; }

A mintakérési URL-hez / tulajdonság-szerkesztő / egzotikus típus / passiógyümölcs, megkapjuk a minta választ:

{"name": "PASSION-FRUIT"}

4. Következtetés

Ebben a gyors cikkben azt láttuk, hogyan használhatnánk az automatikus és egyéni tulajdonságszerkesztő-összerendelést az ember által olvasható konvertálásra Húr értékeket bonyolult Java típusokra.

Példáink teljes forráskódja itt is, mint mindig, a GitHubon van.