Penyunting Harta Tanah Spring

1. Pengenalan

Ringkasnya, Spring menggunakan penyunting harta tanah untuk menguruskan penukaran antara nilai String dan jenis Objek tersuai ; ini berdasarkan Java Beans PropertyEditor.

Dalam tutorial ini, kita akan membahas dua kes penggunaan yang berbeza untuk menunjukkan pengikatan penyunting harta tanah automatik dan pengikatan penyunting harta adat .

2. Pengikatan Penyusun Harta Automatik

Prasarana JavaBeans standard akan menemui kelas PropertyEditor secara automatik jika mereka berada dalam pakej yang sama dengan kelas yang mereka kendalikan. Juga, ini mesti mempunyai nama yang sama dengan kelas itu dan akhiran Editor .

Sebagai contoh, jika kita membuat kelas model CreditCard , maka kita harus menamakan kelas editor CreditCardEditor.

Mari kita lihat contoh ikatan harta praktikal.

Dalam senario kami, kami akan memberikan nombor kad kredit sebagai pemboleh ubah jalur dalam URL permintaan, dan kami akan mengikat nilai itu sebagai objek CreditCard .

Mari mula-mula membuat kelas model CreditCard yang menentukan bidang rawCardNumber, Nombor Pengenalan Bank (6 digit pertama), Nombor Akaun (digit dari 7 hingga 15) dan Kod Cek (digit terakhir):

public class CreditCard { private String rawCardNumber; private Integer bankIdNo; private Integer accountNo; private Integer checkCode; // standard constructor, getters, setters }

Seterusnya, kami akan membuat kelas CreditCardEditor . Ini menerapkan logik perniagaan untuk menukar nombor kad kredit yang diberikan sebagai String ke objek CreditCard .

Kelas penyedia harta tanah harus memperluas PropertyEditorSupport dan melaksanakan kaedah getAsText () dan setAsText () :

public class CreditCardEditor extends PropertyEditorSupport { @Override public String getAsText() { CreditCard creditCard = (CreditCard) getValue(); return creditCard == null ? "" : creditCard.getRawCardNumber(); } @Override public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.isEmpty(text)) { setValue(null); } else { CreditCard creditCard = new CreditCard(); creditCard.setRawCardNumber(text); String cardNo = text.replaceAll("-", ""); if (cardNo.length() != 16) throw new IllegalArgumentException( "Credit card format should be xxxx-xxxx-xxxx-xxxx"); try { 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 () kaedah dipanggil apabila serializing objek kepada String, manakala setAsText () digunakan untuk menukarkan String kepada objek lain.

Oleh kerana kelas-kelas ini terletak dalam pakej yang sama, kami tidak perlu melakukan apa-apa lagi untuk mengikat Editor untuk jenis CreditCard .

Kita sekarang boleh mendedahkan ini sebagai Sumber dalam REST API; operasi mengambil nombor kad kredit sebagai pemboleh ubah jalur permintaan dan Spring akan mengikat nilai teks itu sebagai objek CrediCard dan meneruskannya sebagai argumen kaedah:

@GetMapping(value = "/credit-card/{card-no}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public CreditCard parseCreditCardNumber( @PathVariable("card-no") CreditCard creditCard) { return creditCard; }

Contohnya, untuk contoh permintaan URL / penyunting harta tanah / kad kredit / 1234-1234-1111-0019, kami akan mendapat respons:

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

3. Pengikatan Penyuntingan Harta Tersuai

Sekiranya kita tidak mempunyai kelas jenis yang diperlukan dan kelas penyunting harta tanah dalam paket yang sama atau dengan konvensyen penamaan yang diharapkan, kita harus menentukan pengikatan khusus antara jenis yang diperlukan dan penyunting harta tanah.

Dalam senario pengikatan editor harta tanah khusus kami, nilai String akan diteruskan dalam URL sebagai pemboleh ubah jalur, dan kami akan mengikat nilai itu sebagai objek ExoticType yang hanya menyimpan nilai sebagai atribut.

Seperti di bahagian 2, mari kita buat kelas model ExoticType terlebih dahulu:

public class ExoticType { private String name; // standard constructor, getters, setters }

Dan kelas penyunting harta tanah khas kami CustomExoticTypeEditor yang sekali lagi memperluas PropertyEditorSupport :

public class CustomExoticTypeEditor extends PropertyEditorSupport { @Override public String getAsText() { ExoticType exoticType = (ExoticType) getValue(); return exoticType == null ? "" : exoticType.getName(); } @Override public void setAsText(String text) throws IllegalArgumentException { ExoticType exoticType = new ExoticType(); exoticType.setName(text.toUpperCase()); setValue(exoticType); } }

Oleh kerana Spring tidak dapat mengesan editor harta tanah, kami memerlukan kaedah yang dijelaskan dengan @InitBinder di kelas Pengawal kami yang mendaftarkan editor:

@InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(ExoticType.class, new CustomExoticTypeEditor()); }

Kemudian kita dapat mengikat input pengguna ke objek ExoticType :

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

Untuk URL permintaan sampel / penyunting harta tanah / jenis eksotik / buah-buahan, kami akan mendapat jawapan sampel:

{ "name": "PASSION-FRUIT" }

4. Kesimpulan

Dalam artikel ringkas ini, kami melihat bagaimana kami dapat menggunakan pengikatan penyunting properti automatik dan khusus untuk menukar nilai String yang dapat dibaca manusia menjadi jenis Java yang kompleks.

Kod sumber lengkap contoh kami di sini, seperti biasa, ada di GitHub.