Mengapa:
Mengapa menggunakan AOP untuk mencapai verifikasi?
menjawab:
Spring MVC memiliki mekanisme verifikasi sendiri @valid + BINDINGRESULT, tetapi implementasi default ini harus menerima BindingResult dalam metode pengontrol untuk melakukan verifikasi.
misalnya:
if (result.haserrors ()) {list <bjecterror> allerrors = result.getAllErrors (); Daftar <String> errorLists = ArrayList baru <> (); untuk (objecterror objecterror: allerrors) {errorlists.add (objecterror.getDefaultMessage ()); }}Dapatkan daftar kesalahan. Jika ini diimplementasikan, setiap metode yang memerlukan verifikasi harus dipanggil berulang kali, bahkan jika dienkapsulasi.
Mungkin pernyataan di atas tidak dapat menunjukkan implementasi Spring's @Valid + BindingResult. Biarkan saya memberi Anda "kastanye".
1. Chestnut (versi lama)
1.1 Lapisan Antarmuka (IDAL)
EG: Permintaan Posting Sederhana, @RequestBody Menerima data permintaan, @valid + BindingResult melakukan verifikasi
@ResponseBody @PostMapping ("Body") Public ResponseVo BodyPost (@RequestBody @valid testvo body, BINDINGRESUL Hasil) {// Periksa kesalahan jika (result.haserrors ()) {List <bjjecterror> allerrors = result.getallerrors (); Daftar <String> Daftar = Daftar ArrayList baru <> (); untuk (objecterror objecterror: allerrors) {lists.add (objecterror.getDefaultMessage ()); } return New ResponseVo (httpstatus.bad_request.value (), "parameter kosong", daftar); } return New ResponseVo (httpstatus.ok.value (), "bodypost", null);}1.2 Entitas (VO) Konten Verifikasi
@Valid + BindingResult memiliki banyak anotasi verifikasi, dan Anda dapat menemukannya segera setelah Anda menyentuhnya secara online!
TestVo kelas publik {@getter @setter @min (value = 0, message = "Parameter permintaan ISString tidak boleh kurang dari 0") Private Integer ISInt; @Getter @setter @notblank (message = "Parameter permintaan istring tidak bisa kosong") string pribadi isstring;}1.3 Tes Hasil
2. Verifikasi AOP (versi yang ditingkatkan)
Dapat dilihat bahwa jika banyak tubuh perlu diperiksa seperti bodypost, maka sepotong kode harus direproduksi terus menerus. Bahkan jika diubah menjadi metode yang dapat digunakan kembali kelas orang tua, itu harus dipanggil. Jadi saya masih merasa tidak elegan setelah memikirkannya. Jadi ada AOP untuk verifikasi bagian.
2.1 Lapisan Antarmuka (IDAL)
Ya! Anda membacanya dengan benar, kode di atas hilang, dan tidak perlu memanggil metode bersama dari kelas induk. Hanya satu anotasi yang dilakukan: @paramvalid
@Paramvalid@responsebody@postmapping ("body") Public ResponseVo Bodypost (@RequestBody @Valid TestVo Body, Hasil BINDINGRESULT) {return New ResponseVo ("BodyPost", NULL);}2.2 Anotasi Kustom
Anotasi ini juga merupakan anotasi metode sederhana.
@Target (elementType.method) @retention (retentionpolicy.runtime) public @interface paramValid {}2.3 Poin Kunci! Implementasi Aspek
Penjelasan terperinci dari bagian ini:
@Before: Gunakan metode anotasi @Annotation (xx), metode ini akan dipanggil setiap kali Anda menggunakan anotasi yang diinginkan (@paramvalid).
Joinpoint: Dapatkan parameter metode ini melalui JoinPoint untuk mendapatkan konten yang diverifikasi dengan BindingResult
Migrasi Paket Verifikasi: Migrasi Verifikasi Asli ke Aspek: ValidequestParams
Hasil verifikasi respons:
@Aspek@componentpublic kelas paramValidAspect {private static final logger log = loggerFactory.getLogger (paramvalidaspect.class); @Before ("@annotation (paramvalid)") public void paramValId (titik joinpoint, paramvalid paramValid) {objek [] paramoBj = point.getArgs (); if (paramoBj.length> 0) {if (paramoBj [1] instanceof BINDINGRESULT) {BINDINGRESULT hasil = (BINDINGRESULT) PARAMOBJ [1]; ResponsEvo errorMap = this.validRequestParams (hasil); if (errorMap! = null) {servletRequestAttributes res = (servletRequestAttributes) requestContextholder.getRequestAttributes (); HttpservletResponse response = res.getResponse (); response.setcharacterencoding ("UTF-8"); response.setContentType (mediatype.application_json_utf8_value); response.setstatus (httpstatus.bad_request.value ()); OutputStream output = null; coba {output = response.getoutputStream (); errormap.setCode (null); String error = GSON baru (). TOJSON (errorMap); log.info ("Parameter AOP tidak teratur terdeteksi" + kesalahan); output.write (error.getbytes ("UTF-8")); } catch (ioException e) {log.error (e.getMessage ()); } akhirnya {coba {if (output! = null) {output.close (); }} catch (ioException e) {log.error (e.getMessage ()); }}}}}}}} / *** verifikasi* / respons privateEvo validRequestParams (Hasil BINDINGRESULT) {if (hasil. Daftar <String> Daftar = Daftar ArrayList baru <> (); untuk (objecterror objecterror: allerrors) {lists.add (objecterror.getDefaultMessage ()); } return New ResponseVo (httpstatus.bad_request.value (), "parameter kosong", daftar); } return null; }}2.4 Hasil tes
Setelah membaca dua hasil di atas, Anda dapat membandingkan keunggulan menggunakan Spring AOP dengan @Valid + BindingResult untuk verifikasi:
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.