perkenalan
Saat menggunakan SpringMVC sebagai lapisan pengontrol untuk pengembangan web, seringkali perlu untuk melakukan pemeriksaan parameter pada metode dalam pengontrol. Awalnya, SpringMVC hadir dengan dua anotasi @valid dan anotasi @Valided yang dapat digunakan untuk memeriksa parameter, tetapi hanya dapat diperiksa ketika parameternya adalah kacang. Ini tidak berlaku untuk string atau panjang. Terkadang kedua anotasi ini tiba -tiba gagal (alasannya belum diselidiki dengan cermat). Dalam hal ini, Anda dapat menggunakan AOP Spring dan anotasi khusus untuk menulis fungsi verifikasi parameter sendiri.
Contoh Kode
Catatan: Kode di bagian ini hanyalah sebuah demonstrasi, memberikan ide yang layak, bukan solusi lengkap.
Proyek ini adalah proyek web sederhana, yang digunakan: Spring, SpringMVC, Maven, JDK1.8
Struktur Proyek:
Anotasi Kustom:
Validparam.java:
Paket com.lzumetal.ssm.paramcheck.annotation; import java.lang.annotation.*;/***Dianotasi pada parameter bean, menunjukkan bahwa parameter perlu diperiksa*/@target ({elementType.parameter})@retention(retensipolicy.runtime)@document {{{elementType.parameter)@retensi(retensiPolicyNotnull.java:
Paket com.lzumetal.ssm.paramcheck.annotation; import java.lang.annotation.*;@target ({elementType.field, elementType.parameter})@retention(retentionPolicy.runtime)@documentedpublic @interface notnull {string msg () default) }Notempty.java:
Paket com.lzumetal.ssm.paramcheck.annotation; import java.lang.annotation.*;@target ({elementType.field, elementType.parameter})@retention(retentionpolicy.runtime)@documentedpublic @interface notempty {string msg () default) } Potongan wajah
Paramcheckaspect.java:
Paket com.lzumetal.ssm.paramcheck.aspect; import com.lzumetal.ssm.paramcheck.annotation.notempty; import com.lzumetal.ssm.paramcheck.annotation.notnull; import com.lzumetal.ssm.paramcheck.annotation.notasion org.apache.commons.lang3.stringutils; impor org.aspectj.lang.joinpoint; impor org.aspectj.lang.annotation.aspect; impor org.aspectj.lang.annotation.Before; impor org.aspectj.lang.reflect.methodsignature; javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import javax.servlet.http.httpservletResponse; impor javax.servlet.http.htpsession; java.lang.reflect.parameter; import java.util.arrays;/***Parameter Memeriksa kelas facet*/@aspek@componentpublic kelas Paramcheckaspect {@before ("Eksekusi (*com.lzumetal.ssm.paramcheck.controller.*.*.*. objek objek parameter [] args = joinpoint.getArgs (); // Dapatkan Metode Parameter Metode Signatureureure = (Methodyignature) goinpoint.getSignature (); Parameter [] parameter = Signature.getMethod (). GetParameters (); untuk (int i = 0; i <parameter.length; i ++) {parameter parameter = parameter [i]; // tipe dasar parameter Java sendiri (seperti integer, string) diproses jika (isPrimite (parameter.getType ())) {notnull notnull = parameter.getannotation (notnull.class); if (notnull! = null && args [i] == null) {lempar runtimeException baru (parameter.toString () + notnull.msg ()); } // TODO Lanjutkan; } /** Tidak ada pemrosesan yang dilakukan ketika anotasi @ValidParam tidak ditandai, atau ketika itu httpservletrequest, httpservletResponse, atau httpsession tidak dilakukan* / if (parameter.getpype (). ISassignableFrom (httpservletrequest.| parameter.getType (). ISassignableFrom (httpsession.class) ||. } Class <?> Paramclazz = parameter.getType (); // Dapatkan objek parameter yang sesuai dengan tipe. Antarmuka dalam pengontrol dalam proyek aktual tidak akan melewati dua parameter dari jenis kustom yang sama, jadi gunakan findFirst () langsung di sini. Objek arg = arrays.stream (args) .filter (ar -> paramclazz.isassignableFrom (ar.getClass ())). FindFirst (). Get (); // Dapatkan semua variabel anggota dari bidang parameter [] DecledFields = paramclazz.getDeclaredFields (); untuk (bidang bidang: reclaredFields) {field.setAccessible (true); // Periksa bidang yang ditandai dengan @notnull notnull = field.getannotation (notnull.class); if (notnull! = null) {objek fieldValue = field.get (arg); if (fieldValue == null) {lempar runtimeException baru (field.getName () + notnull.msg ()); }} // Periksa bidang yang ditandai dengan anotasi @notempty, notempty hanya digunakan pada tipe string notempty notempty = field.getannotation (notempty.class); if (notempty! = null) {if (! string.class.isassignableFrom (field.getType ())) {lempar runtimeException baru ("notempty annotation menggunakan di kelas bidang yang salah"); } String fieldStr = (string) field.get (arg); if (stringutils.isblank (fieldStr)) {lempar runimeException baru (field.getName () + notempty.msg ()); }}}}} /** * Tentukan apakah itu tipe dasar: termasuk string * @param clazz clazz * @return true: ya; Salah: Tidak */ private boolean isPrimite (class <?> clazz) {return clazz.isprimitive () || clazz == string.class; }} Parameter Javabean
Studentparam.java:
Paket com.lzumetal.ssm.paramcheck.requestparam; import com.lzumetal.ssm.paramcheck.annotation.notempty; import com.lzumetal.ssm.paramcheck.annotation.notnull; studentparam kelas publik {@notnull private integer id; usia bilangan bulat pribadi; @NotEempty Private String Name; // dapatkan, atur metode dihilangkan ...} Pengontrol untuk memverifikasi verifikasi parameter
TestController.java:
Paket com.lzumetal.ssm.paramcheck.controller; import com.google.gson.gson; import com.lzumetal.ssm.paramcheck.annotation.notnull; import com.lzumetal.ssmetmcheck.annotation.validparam; import com.lzumetal.ssmetalparal org.springframework.stereotype.controller; impor org.springframework.web.bind.annotation.requestmapping; impor org.spramework.web.bind.annotation.RequestMethod; org.springframework.web.bind.annotation; private static gson gson = baru gson (); @ResponseBody @RequestMapping (value = "/test", Method = requestMethod.post) public Studentparam checkparam (@validparam Studentparam param, @notnull batas integer) {System.out.println (gson.tojson (param)); System.out.println (batas); Param pengembalian; }} Kode sampel di bagian ini telah diunggah ke github: https://github.com/liaosilzu2007/ssm-parent.git
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.