Artikel ini secara singkat memperkenalkan cara memperkenalkan langkah -langkah validasi, cara mengurangi jumlah kode melalui validasi khusus dan meningkatkan produktivitas. Disebutkan: Valid dari atribut tipe non-primitif, pemrosesan metode GET, resolusi terpadu dari pesan kesalahan validasi.
Implementasi validasi aktual dalam artikel ini dipercayakan pada validasi hibernasi untuk diproses
Konfigurasi Dasar
POM memperkenalkan dependensi Maven
<!-Validasi Mulai-> <dependency> <GroupId> javax.validation </groupId> <ArtifactId> validasi-API </artifactid> <version> 1.1.0.Final </version> </Dependency> <groupid> org.hibernate </groupid> <ArtiFacTid> HIBERAT-HIBERAT-HIBERAT-ORGIF-org. <Version> 5.4.0.Final </version> </gantage> <!-Validasi End->
Tambahkan Konfigurasi Validasi
Tambahkan konfigurasi berikut ke spring-mvc-servlet.xml:
<mvc: validator yang digerakkan anotasi = "validator"> <bean id = "validator"> <name properti = "providerclass" value = "org.hibernate.validator.hibernatevalidator"/> <nama properti = "validationMessageSource" ref = "messageSource" // pesan sumber daya adalah sumber daya.
Pengecualian khusus
Personalisasi pesan kesalahan validasi, dan informasi yang dikembalikan ke penelepon lebih ramah. Konfigurasi berikut ditambahkan ke ApplicationContext.xml:
<!-Muat file sumber daya pesan i18n-> <bean id = "messesource"> <name properti = "Basenames"> <cist> <value> errorMsg </ value> <val validasi> validasi_error </value> </list> </propert> </bean> <bean id = "validationResceptionRerver"/
Ditambahkan ke proyek ClassPath: Validation_error_zh_cn.properties File Sumber Daya:
#kesalahan msg untuk validasi input#commonfield.can.not.be.null = {field} tidak dapat menjadi field. Implementasi ValidationExceptionResovler:
ValidationExceptionResovler.java
@SLF4JPUBLIC Kelas ValidationExceptionResovler Memperluas AbstracThandLerExceptionResolver {Public ValidationExceptionResovler () {// Setel order dan jalankan this.setorder (0); } /** * Tangani kasus di mana argumen yang dianotasi dengan {@code @valid} seperti * {@link} atau {@link} argumen gagal validasi. * <p> * Penangan Pengecualian Exception Validasi Kustom * Dapatkan pesan kesalahan validasi spesifik dan kumpulkan CommonResponse dan kembalikan ke penelepon. * * @param permintaan permintaan http saat ini * @param respons saat ini respons http * @param handler pawang yang dieksekusi * @Return Sebuah model kosong dan yang menunjukkan pengecualian ditangani * @throws ioException yang dilemparkan dari response.senderror () */ @responseBody yang dilindungi ModelLemethodangkerRaraW BINDINGRESULT, permintaan httpservletRequest, respons httpservletResponse, penangan objek) melempar ioException {daftar <bjjecterror> kesalahan = bindingResult.getallerRors (); StringBuffer errmsgbf = new stringBuffer (); untuk (kesalahan objecterror: kesalahan) {string mass = error.getDefaultMessage (); errmsgbf.append (pijat); errmsgbf.append ("||"); } String errmsgString = errmsgbf.toString (); errmsgstring = errmsgstring.length ()> 2? errmsgstring.substring (0, errmsgstring.length () - 2): errmsgstring; log.Error ("Validasi Gagal! {}", errmsgString); Peta <String, Object> MAP = TREEMAP baru <String, Object> (); peta.put ("Sukses", false); peta.put ("errorCode", "9999"); peta.put ("errormsg", errmsgstring); ModelAndView mav = new ModelAndView (); MappingJackson2JSonView view = new MappingJackson2JSonView (); view.setattributeMap (peta); mav.setview (view); mengembalikan mav; } @Override Protected ModelAndView DoresolveException (permintaan httpservletRequest, respons httpservletResponse, penangan objek, pengecualian ex) {bindingResult BINDINGRESULT = null; if (ex instanceof MethodArgumentNotValideException) {BINDINGRESULT = ((MethodArgumentNotValideException) ex) .getBindingResult (); } lain jika (ex instance dari bindException) {bindingResult = ((bindException) ex) .getBindingResult (); } else {// Pengecualian Lainnya, abaikan} if (BINDINGRESULT! = NULL) {coba {return handlemeThoDargumentNotValidexception (BINDINGRESULT, permintaan, respons, pawang); } catch (ioException e) {log.error ("DoresolveException:", e); }} return null; }} Tambahkan @Valid di Controller
@RequestMapping ("/buy")@responseBodypublic Baseresponse buy (@RequestBody @valid BuyflowerRequest Permintaan) melempar pengecualian {// ......} Tambahkan anotasi validasi ke atribut yang memerlukan validasi pada permintaan kacang
@Setter@getterpublic kelas buyflowerRequest {@notempty (message = "{name.can.not.be.null}") nama string pribadi;} Validasi objek sekunder
Metode penulisan di atas hanya dapat memverifikasi atribut tipe dasar dari BuyFlowerRequest, tetapi tidak ada cara untuk memvalidasi atribut atribut objek. Jika Anda perlu memvalidasi atribut objek sekunder, Anda perlu menambahkan anotasi validasi @valid dan spesifik ke objek sekunder dan atribut objek sekunder pada saat yang sama.
Metode penulisan berikut:
@Setter @getterpublic kelas buyflowerRequest {@notempty (field = "bianname") nama string pribadi; @Min (bidang = "harga", nilai = 1) harga int pribadi; @Notnull Daftar pribadi <PayType> paytypeList;} @setter @getterpublic kelas paytype {@valid @min (value = 1) private int paytype; @Valid @min (value = 1) private int payamount;} Lebih lanjut kurangi jumlah pengkodean
Untuk mengurangi beban kerja pengkodean, melalui anotasi validasi khusus, cobalah untuk meneruskan nama validasi yang diajukan ke file sumber daya dari pesan kesalahan, sehingga menghindari penulisan templat pesan yang berbeda untuk setiap domain.
Berikut adalah contoh @NotNull yang ditulis ulang:
1. Tentukan anotasi validasi, perhatikan bahwa bidang () ditambahkan dibandingkan dengan anotasi asli, yang digunakan untuk meneruskan nama yang diajukan yang divalidasi.
Notnull.java
@Target ({elementType.method, elementType.field, elementType.annotation_type, elementType.constructor, elementType.parameter})@kendala (validatedby = {notnullValidator.class})@retensi (retentionPolicy.runTime) noullface noTnull noTnull})@retensi (retentionPolicy.runTime) @Interface noTnull noTnull}) {retention (retentionPolicy.runTime) @Interface noTnull noTnull noTnull {(retention (retentionPolicy. String message () default "{field.can.not.be.null}"; Kelas <?> [] Grup () default {}; Kelas <? Extends payload> [] payload () default {};} 2. Tentukan validator, semua validator mengimplementasikan antarmuka Concternvalidator:
Notnullvalidator.java
kelas publik notnullValidator mengimplementasikan ConceptValidator <notnull, object> {@Override public void initialize (notnull annotation) {} @Override public boolean isValid (objek str! = ConsepaintValidatorContext ConstraintValidatorContext) {return str! = NULL; }} 3. Tambahkan anotasi validasi ke yang diajukan, perhatikan menentukan nilai yang diajukan. Jika pesan tidak memiliki persyaratan yang dipersonalisasi, Anda tidak perlu menentukannya. Komponen validasi akan mengisi pesan default dengan sendirinya.
BuyflowerRequest.java
@Setter @getterpublic kelas buyflowerRequest {@notempty (field = "bianname") nama string pribadi; @Min (field = "harga", value = 1) private int price;} Catatan: Anotasi @NotNull sudah mendukung verifikasi daftar khusus. Untuk node tipe daftar, jika daftar == null || list.size () == 0 akan mengembalikan false dan validasi gagal. Saat ini, anotasi @notnull, @notempty, @min, @max telah disesuaikan sesuai dengan ide ini, dan dapat ditemukan dalam proyek barang.
Dukungan mendapatkan permintaan
Contoh di atas adalah semua permintaan pasca. @RequestBody dapat menyelesaikan permintaan pos, tetapi mereka tidak mendukung permintaan mendapatkan. Baca dokumentasi Spring dan kode sumber dan menemukan bahwa @ModelAttribute dapat menyelesaikan permintaan menjadi kacang dan validasi dukungan. Untuk detailnya, Anda dapat membaca kode Sumber Spring: ModelAttributeMethodProcessor.resolveargument () metode.
Contoh Penggunaan:
@RequestMapping (value = "/buy", Method = requestMethod.get) @ResponseBodyPublic Baseresponse detail (@valid @modelattribute Permintaan DetailFlowerRequest) Lempar Pengecualian {DetailFlowerResponse Response = detail baruFlowerResponse (); response.setname (request.getName ()); return resultFactory.success (respons, baseresponse.class);} Todo
1. Perluas validasi sesuai dengan skenario bisnis, seperti: format tanggal, jumlah, dll.
2. Dukungan validasi verifikasi hubungan beberapa bidang
Lampiran: Kode Kunci Implementasi Validasi Musim Semi
@RequestBody
Kelas Implementasi: RequestResponseBodyMethodProcessor.java
Objek Publik ResolveARGUMEN (MethodParameter Parameter, ModelAndViewContainer Mavcontainer, NativeWebRequest WebRequest, WebDataBinderFactory BinderFactory) melempar Exception {objek arg = this.readwithMessageConVerters (WebRequest, parameter, parameter. String name = conventions.getVariablenameforparameter (parameter); Binder webdatabinder = bindfactory.createBinder (webRequest, arg, name); if (arg! = null) {this.validateIfapplicle (binder, parameter); if (binder.getBindingResult (). hasErrors () && this.isBindExceptionRequired (binder, parameter)) {lempar MethodArgumentNotValideException baru (parameter, binder.getBindingResult ()); }} mavcontainer.addattribute (bindingResult.model_key_prefix + name, binder.getBindingResult ()); mengembalikan arg;} @Modelattuite
Kelas Implementasi: ModelAttributeMethodProcessor.java
Objek akhir publik ResolveARGUMEN (MethodParameter Parameter, ModelAndViewContainer Mavcontainer, NativeWebRequest WebRequest, WebDataBinderFactory BinderFactory) melempar Exception {String name = Modelfactory.getNamEforParameter (parameter); Objek atribut = mavcontainer.containsattribute (name)? mavcontainer.getModel (). get (name): this.createAttribute (nama, parameter, bindfactory, webRequest); if (! mavcontainer.isBindingDisabled (name)) {ModelAttribute ann = (ModelAttribute) parameter.getParameterAnnotation (ModelAttribute.class); if (ann! = null &&! ann.binding ()) {mavcontainer.setBindingDisabled (name); }} Binder webdatabinder = bindfactory.createBinder (webRequest, atribut, nama); if (binder.getTarget ()! = null) {if (! mavcontainer.isbindingDisabled (name)) {this.bindrequestparameters (binder, webRequest); } this.validateIfapplible (binder, parameter); if (binder.getBindingResult (). haserrors () && this.isBindExceptionrequired (binder, parameter)) {lempar bindException baru (binder.getBindingResult ()); }} Peta <String, Object> bindingResultModel = binder.getBindingResult (). GetModel (); mavcontainer.removeattributes (pengikatresultModel); mavcontainer.addallattributes (BINDINGRESULTMODEL); kembalikan binder.convertifNecessary (binder.getTarget (), parameter.getParameterType (), parameter);}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.