Spring Custom Property Editor

1. Introduktion

Kort sagt, Spring bruger ejendomsredaktører til at styre konvertering mellem Snor værdier og brugerdefinerede Objekt typer; dette er baseret på Java Beans PropertyEditor.

I denne vejledning gennemgår vi to forskellige brugssager til demonstration automatisk binding af ejendomseditor og binding af tilpasset ejendomseditor.

2. Automatisk egenskabseditorbinding

Standard JavaBeans infrastruktur opdager automatisk PropertyEditor klasser, hvis de er i samme pakke som den klasse, de håndterer. Disse skal også have samme navn som den klasse plus Redaktør suffiks.

For eksempel, hvis vi opretter en Kreditkort modelklasse, så skal vi navngive redaktørklassen CreditCardEditor.

Lad os nu gennemgå et praktisk eksempel på bindende egenskaber.

I vores scenarie videregiver vi et kreditkortnummer som en stivariabel i anmodnings-URL'en, og vi binder denne værdi som et kreditkort objekt.

Lad os først oprette Kreditkort modelklasse, der definerer felter rawCardNumber, Bankidentifikationsnummer (de første 6 cifre), kontonummer (cifre fra 7 til 15) og checkkode (sidste ciffer):

offentlig klasse CreditCard {private String rawCardNumber; privat HeltalsbankIdNo; privat heltalskontoNo; privat heltal checkCode; // standard konstruktør, getters, setters}

Derefter opretter vi CreditCardEditor klasse. Dette implementerer forretningslogikken til konvertering af kreditkortnummer angivet som en Snor til en Kreditkort objekt.

Ejendomsredaktørklassen skal udvides PropertyEditorSupport og implementere getAsText () og setAsText () metoder:

offentlig klasse CreditCardEditor udvider PropertyEditorSupport {@ Override public String getAsText () {CreditCard creditCard = (CreditCard) getValue (); returner kreditkort == null? "": creditCard.getRawCardNumber (); } @ Override offentlig ugyldighed setAsText (strengtekst) kaster IllegalArgumentException {if (StringUtils.isEmpty (text)) {setValue (null); } andet {CreditCard kreditkort = nyt kreditkort (); creditCard.setRawCardNumber (tekst); String cardNo = text.replaceAll ("-", ""); hvis (cardNo.length ()! = 16) smider nyt IllegalArgumentException ("Kreditkortformat skal være xxxx-xxxx-xxxx-xxxx"); prøv {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))); } fange (NumberFormatException nfe) {kast nyt IllegalArgumentException (nfe); } setValue (kreditkort); }}}

Det getAsText () metode kaldes, når der serieliseres et objekt til en Snor, mens setAsText () bruges til at konvertere en Snor til et andet objekt.

Da disse klasser er placeret i samme pakke, behøver vi ikke gøre noget andet for at binde Redaktør for type Kreditkort.

Vi kan nu eksponere dette som en ressource i en REST API; operationen tager et kreditkortnummer som en anmodningssti-variabel, og Spring binder denne tekstværdi som en CrediCard objekt og videregive det som et metodeargument:

@GetMapping (værdi = "/ kreditkort / {kort-nr}", producerer = MediaType.APPLICATION_JSON_UTF8_VALUE) offentligt kreditkort parseCreditCardNumber (@PathVariable ("kort-nr") kreditkort kreditkort) {retur kreditkort; }

For eksempel til en eksempel-URL til anmodning / ejendomsredaktør / kreditkort / 1234-1234-1111-0019, vi får svaret:

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

3. Binding af brugerdefineret egenskabseditor

Hvis vi ikke har den krævede typeklasse og egenskabseditorklassen i samme pakke eller med de forventede navngivningskonventioner, bliver vi nødt til at definere en brugerdefineret binding mellem den krævede type og egenskabseditoren.

I vores tilpassede ejendomsredaktør bindingsscenarie, a Snor værdi sendes i URL'en som stivariabel, og vi binder den værdi som en ExoticType objekt, der kun holder værdien som attribut.

Som i afsnit 2, lad os først oprette en modelklasse ExoticType:

offentlig klasse ExoticType {privat strengnavn; // standard konstruktør, getters, setters}

Og vores klasse for tilpasset ejendomsredaktør CustomExoticTypeEditor som igen strækker sig PropertyEditorSupport:

offentlig klasse CustomExoticTypeEditor udvider PropertyEditorSupport {@Override public String getAsText () {ExoticType exoticType = (ExoticType) getValue (); returnere eksotisk Type == null? "": exoticType.getName (); } @ Override offentlig ugyldighed setAsText (strengtekst) kaster IllegalArgumentException {ExoticType exoticType = new ExoticType (); exoticType.setName (text.toUpperCase ()); setValue (eksotisk type); }}

Da Spring ikke kan registrere ejendomseditoren, vi har brug for en metode, der er kommenteret med @InitBinder i vores Controller klasse, der registrerer editoren:

@InitBinder offentlig ugyldigt initBinder (WebDataBinder-bindemiddel) {binder.registerCustomEditor (ExoticType.class, ny CustomExoticTypeEditor ()); }

Så kan vi binde brugerindgangen til ExoticType objekt:

@GetMapping (værdi = "/ eksotisk-type / {værdi}", producerer = MediaType.APPLICATION_JSON_UTF8_VALUE) offentlig ExoticType parseExoticType (@PathVariable ("værdi") ExoticType eksotisk Type) {returner eksotisk Type; }

For URL-en til anmodning om prøve / ejendomsredaktør / eksotisk type / passionsfrugt, vi får prøvesvaret:

{"name": "PASSION-FRUIT"}

4. Konklusion

I denne hurtige artikel så vi, hvordan vi kunne bruge automatisk og tilpasset egenskabseditorbinding til at konvertere menneskelig læsbar Snor værdier til komplekse Java-typer.

Den fulde kildekode for vores eksempler her er som altid over på GitHub.


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