การแนะนำ
เมื่อใช้ SpringMVC เป็นเลเยอร์คอนโทรลเลอร์สำหรับการพัฒนาเว็บมักจำเป็นต้องทำการตรวจสอบพารามิเตอร์เกี่ยวกับวิธีการในคอนโทรลเลอร์ ในขั้นต้น SpringMVC มาพร้อมกับคำอธิบายประกอบสองคำอธิบายประกอบ @Valid และ @Validated คำอธิบายประกอบที่สามารถใช้ในการตรวจสอบพารามิเตอร์ แต่สามารถตรวจสอบได้ก็ต่อเมื่อพารามิเตอร์เป็นถั่ว ไม่สามารถใช้ได้กับสตริงหรือยาว บางครั้งคำอธิบายประกอบทั้งสองนี้ก็ล้มเหลว (เหตุผลไม่ได้ถูกสอบสวนอย่างระมัดระวัง) ในเรื่องนี้คุณสามารถใช้ AOP และคำอธิบายประกอบที่กำหนดเองของ Spring เพื่อเขียนฟังก์ชั่นการตรวจสอบพารามิเตอร์ด้วยตัวเอง
ตัวอย่างรหัส
หมายเหตุ: รหัสในส่วนนี้เป็นเพียงการสาธิตให้ความคิดที่เป็นไปได้ไม่ใช่ทางออกที่สมบูรณ์
โครงการนี้เป็นโครงการเว็บที่ใช้งานง่ายซึ่งใช้: Spring, SpringMVC, Maven, JDK1.8
โครงสร้างโครงการ:
คำอธิบายประกอบที่กำหนดเอง:
ValidParam.java:
แพ็คเกจ com.lzumetal.ssm.paramcheck.annotation; นำเข้า java.lang.annotation.*;/***หมายเหตุประกอบบนถั่วพาราม
notnull.java:
แพ็คเกจ com.lzumetal.ssm.paramcheck.annotation; นำเข้า java.lang.annotation.*;@target ({elementtype.field, elementType.parameter})@retention(retentionPolicy.runtime)@documentedPublic -notempty.java:
แพ็คเกจ com.lzumetal.ssm.paramcheck.annotation; นำเข้า java.lang.annotation.*;@target ({elementtype.field, elementType.parameter})@retention(retentionPolicy.runtime)@documentedPublic - หน้าตัด
paramcheckaspect.java:
แพ็คเกจ com.lzumetal.ssm.paramcheck.aspect; นำเข้า com.lzumetal.ssm.paramcheck.annotation.notempty; นำเข้า com.lzumetal.sm.paramcheck.annotation.notnull; นำเข้า com.lzumetal.sm.paramcheck. org.aspectj.lang.joinpoint; นำเข้า org.aspectj.lang.annotation.aspect; นำเข้า org.aspectj.lang.annotation.before; นำเข้า org.aspectj.lang.reflect.methodsignature; นำเข้า org.springframework.stereotype javax.servlet.http.htttservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า Javax.servlet.http.httpservletresponse; นำเข้า Javax.servlet.http.https java.lang.reflect.parameter; นำเข้า Java.util.Arrays;/***การตรวจสอบพารามิเตอร์คลาส facet*/@@@ponentpublic คลาส paramcheckaspect {@before ("การดำเนินการ (*com.lzumetal.ssm.paramcheck.controller.*.*(.. ) Object [] args = joinpoint.getargs (); // รับพารามิเตอร์เมธอดวิธีการลายเซ็น = (วิธีการออกแบบ) joinpoint.getSignature (); พารามิเตอร์ [] พารามิเตอร์ = signature.getMethod (). getParameters (); สำหรับ (int i = 0; i <parameters.length; i ++) {พารามิเตอร์พารามิเตอร์ = พารามิเตอร์ [i]; // พารามิเตอร์ประเภทพื้นฐานของ Java (เช่นจำนวนเต็ม, สตริง) จะถูกประมวลผลหาก (isprimite (parameter.getType ())) {notnull notnull = parameter.getAnnotation (notnull.class); if (notnull! = null && args [i] == null) {โยน runtimeException ใหม่ (parameter.toString () + notnull.msg ()); } // todo ดำเนินการต่อ; } /** ไม่มีการประมวลผลใด ๆ เมื่อไม่ได้ทำเครื่องหมายคำอธิบายประกอบ @ValidParam หรือเมื่อเป็น httpservletrequest, httpservletResponse หรือ httpsession ไม่ได้ทำ* / if (parameter.getType (). parameter.getType (). isAssignablefrom (httpsession.class) || parameter.getAnnotation (validParam.class) == null) {ดำเนินการต่อ; } คลาส <?> paramclazz = parameter.getType (); // รับวัตถุพารามิเตอร์ที่สอดคล้องกับประเภท อินเทอร์เฟซในคอนโทรลเลอร์ในโครงการจริงจะไม่ผ่านพารามิเตอร์สองพารามิเตอร์ของประเภทที่กำหนดเองเดียวกันดังนั้นใช้ findFirst () โดยตรงที่นี่ Object arg = arrays.stream (args) .filter (ar -> paramclazz.isassignablefrom (ar.getClass ())). findFirst (). get (); // รับตัวแปรสมาชิกทั้งหมดของฟิลด์พารามิเตอร์ [] ประกาศฟิลด์ = paramclazz.getDeclaredFields (); สำหรับ (ฟิลด์ฟิลด์: ประกาศฟิลด์) {field.setAccessible (จริง); // ตรวจสอบฟิลด์ที่ทำเครื่องหมายด้วย @NotNull NOTNULL = FIELD.GETANNOTATION (NOTNULL.CLASS); if (notnull! = null) {object fieldValue = field.get (arg); if (fieldValue == null) {โยน runtimeException ใหม่ (field.getName () + notnull.msg ()); }} // ตรวจสอบฟิลด์ที่ทำเครื่องหมายด้วยคำอธิบายประกอบ @NotEmpty, NotEmpty ใช้เฉพาะกับประเภทสตริง notEmpty notEmpty = field.getNanotation (notempty.class); if (notempty! = null) {ถ้า (! string.class.isassignableFrom (field.getType ())) {โยน runtimeException ใหม่ ("คำอธิบายประกอบ notempty โดยใช้ในคลาสที่ไม่ถูกต้อง"); } String fieldStr = (String) field.get (arg); if (stringutils.isblank (fieldstr)) {โยน runtimeException ใหม่ (field.getName () + notempty.msg ()); }}}}} /** * พิจารณาว่าเป็นประเภทพื้นฐาน: รวมถึงสตริง * @param clazz clazz * @return จริง: ใช่; เท็จ: ไม่ใช่ */ บูลีนส่วนตัว isprimite (คลาส <?> clazz) {return clazz.isprimitive () || clazz == string.class; - พารามิเตอร์ Javabean
StudentParam.java:
แพ็คเกจ com.lzumetal.ssm.paramcheck.requestparam; นำเข้า com.lzumetal.ssm.paramcheck.annotation.notempty; นำเข้า com.lzumetal.ssm.paramcheck.annotation.notnull; อายุจำนวนเต็มส่วนตัว @NotEmpty ชื่อสตริงส่วนตัว; // รับ, ตั้งค่าวิธีการละเว้น ... }
คอนโทรลเลอร์สำหรับการตรวจสอบการตรวจสอบพารามิเตอร์
TestController.java:
แพ็คเกจ com.lzumetal.ssm.paramcheck.controller; นำเข้า com.google.gson.gson; นำเข้า com.lzumetal.ssm.paramcheck.annotation.notnull; นำเข้า com.lzumetal.ssm.paramcheck.annotation.validparam; org.springframework.stereotype.controller; นำเข้า org.springframework.web.bind.annotation.requestmapping; นำเข้า org.springframework.web.bind.annotation.RequestMethod; TestController {ส่วนตัวคงที่ GSON GSON = new GSON (); @ResponseBody @RequestMapping (value = "/test", method = requestMethod.post) Public StudentParam CheckParam (@ValidParam Param Param, @NotNull Integer Limit) {System.out.println (gson.tojson (param)); System.out.println (ขีด จำกัด ); return param; - รหัสตัวอย่างในส่วนนี้ได้รับการอัปโหลดไปยัง GitHub: https://github.com/liaosilzu2007/ssm-parent.git
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น