Editor Properti Khusus Musim Semi

1. Perkenalan

Sederhananya, Spring banyak menggunakan editor properti untuk mengelola konversi antara nilai String dan jenis Objek kustom ; ini didasarkan pada Java Beans PropertyEditor.

Dalam tutorial ini, kita akan membahas dua kasus penggunaan berbeda untuk mendemonstrasikan pengikatan editor properti otomatis dan pengikatan editor properti khusus .

2. Pengikatan Editor Properti Otomatis

Infrastruktur JavaBeans standar akan secara otomatis menemukan kelas PropertyEditor jika mereka berada dalam paket yang sama dengan kelas yang mereka tangani. Juga, ini harus memiliki nama yang sama dengan kelas tersebut ditambah akhiran Editor .

Misalnya, jika kita membuat kelas model CreditCard , maka kita harus memberi nama kelas editor CreditCardEditor.

Sekarang mari kita lihat contoh pengikatan properti praktis.

Dalam skenario kami, kami akan memberikan nomor kartu kredit sebagai variabel jalur di URL permintaan, dan kami akan mengikat nilai itu sebagai objek CreditCard .

Mari pertama-tama buat kelas model CreditCard yang mendefinisikan bidang rawCardNumber, Nomor Identifikasi Bank (6 digit pertama), Nomor Rekening (digit dari 7 sampai 15) dan Kode Cek (digit terakhir):

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

Selanjutnya, kita akan membuat kelas CreditCardEditor . Ini mengimplementasikan logika bisnis untuk mengubah nomor kartu kredit yang diberikan sebagai String ke objek CreditCard .

Kelas editor properti harus memperluas PropertyEditorSupport dan mengimplementasikan metode 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); } } }

Metode getAsText () dipanggil saat membuat serialisasi objek menjadi String, sedangkan setAsText () digunakan untuk mengonversi String ke objek lain.

Karena kelas-kelas ini berada dalam paket yang sama, kita tidak perlu melakukan apa pun untuk mengikat Editor untuk jenis CreditCard .

Sekarang kita dapat mengekspos ini sebagai Resource di REST API; operasi mengambil nomor kartu kredit sebagai variabel jalur permintaan dan Spring akan mengikat nilai teks itu sebagai objek CrediCard dan meneruskannya sebagai argumen metode:

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

Misalnya, untuk contoh permintaan URL / property-editor / credit-card / 1234-1234-1111-0019, kita akan mendapatkan responnya:

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

3. Pengikatan Editor Properti Khusus

Jika kita tidak memiliki kelas tipe yang diperlukan dan kelas editor properti dalam paket yang sama atau dengan konvensi penamaan yang diharapkan, kita harus menentukan pengikatan khusus antara tipe yang diperlukan dan editor properti.

Dalam skenario pengikatan editor properti khusus kami, nilai String akan diteruskan di URL sebagai variabel jalur, dan kami akan mengikat nilai itu sebagai objek ExoticType yang hanya menyimpan nilai sebagai atribut.

Seperti di bagian 2, pertama-tama mari buat kelas model ExoticType:

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

Dan kelas editor properti kustom kami CustomExoticTypeEditor yang lagi-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); } }

Karena Spring tidak dapat mendeteksi editor properti, kita memerlukan metode yang dianotasi dengan @InitBinder di kelas Controller kita 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 contoh URL permintaan / property-editor / eksotis-type / passion-fruit, kita akan mendapatkan contoh responnya:

{ "name": "PASSION-FRUIT" }

4. Kesimpulan

Dalam artikel singkat ini, kami melihat bagaimana kami dapat menggunakan pengikatan editor properti otomatis dan khusus untuk mengonversi nilai String yang dapat dibaca manusia menjadi tipe Java yang kompleks.

Kode sumber lengkap dari contoh kami di sini, seperti biasa, di GitHub.