ทำไม:
ทำไมต้องใช้ AOP เพื่อให้ได้การตรวจสอบ?
คำตอบ:
Spring MVC มีกลไกการตรวจสอบของตัวเอง @valid + bindingResult แต่การใช้งานเริ่มต้นนี้จะต้องได้รับ bindingResult ในวิธีการควบคุมเพื่อทำการตรวจสอบ
เช่น:
if (result.haserrors ()) {list <ObjecTerror> allerRors = result.getAllERrors (); รายการ <String> errorlists = arrayList ใหม่ <> (); สำหรับ (objecterror objecterror: allerrors) {errorlists.add (objecterror.getDefaultMessage ()); -รับรายการข้อผิดพลาด หากนำไปใช้งานแต่ละวิธีที่ต้องมีการตรวจสอบจะต้องเรียกซ้ำ ๆ แม้ว่าจะถูกห่อหุ้ม
บางทีคำสั่งข้างต้นไม่สามารถระบุการใช้งาน @valid + bindingResult ของฤดูใบไม้ผลิ ให้ฉันให้ "เกาลัด"
1. เกาลัด (รุ่นเก่า)
1.1 อินเตอร์เฟสเลเยอร์ (IDAL)
เช่น: คำขอโพสต์อย่างง่าย @requestbody ได้รับข้อมูลคำขอ @valid + bindingResult ทำการตรวจสอบ
@ResponseBody @PostMapping ("body") การตอบสนองสาธารณะ bodypost (@requestbody @valid testvo body, ผล bindingresult) {// ตรวจสอบข้อผิดพลาดถ้า (result.haserrors ()) {รายการ <objecterror> AllerRors = result.get.getElrorrors (); รายการ <String> list = arrayList ใหม่ <> (); สำหรับ (objecterror objecterror: allerrors) {lists.add (objecterror.getDefaultMessage ()); } ส่งคืน ResponsEvo ใหม่ (httpstatus.bad_request.value (), "พารามิเตอร์ว่าง", รายการ); } ส่งคืน ResponseVo ใหม่ (httpstatus.ok.value (), "bodypost", null);}1.2 เนื้อหาการตรวจสอบเอนทิตี (VO)
@Valid + bindingResult มีคำอธิบายประกอบการตรวจสอบมากมายและคุณสามารถค้นหาได้ทันทีที่คุณสัมผัสออนไลน์!
Public Class TestVo {@getter @Setter @min (value = 0, message = "การร้องขอพารามิเตอร์ isstring ไม่น้อยกว่า 0") จำนวนเต็มส่วนตัว Isint; @getter @setter @NotBlank (message = "คำขอพารามิเตอร์ isstring ไม่ว่าง") สตริงส่วนตัว isstring;}1.3 การทดสอบผลลัพธ์
2. การตรวจสอบ AOP (เวอร์ชันอัพเกรด)
จะเห็นได้ว่าหากจำเป็นต้องตรวจสอบร่างกายหลายตัวเช่น BodyPost ต้องทำซ้ำรหัสอย่างต่อเนื่อง แม้ว่าจะเปลี่ยนเป็นวิธีการที่นำกลับมาใช้ใหม่ได้ก็จะต้องเรียก ดังนั้นฉันยังรู้สึกว่ามันไม่สง่างามหลังจากคิดถึงมัน ดังนั้นจึงมี AOP สำหรับการตรวจสอบส่วน
2.1 อินเตอร์เฟสเลเยอร์ (IDAL)
ใช่! คุณอ่านถูกต้องรหัสด้านบนหายไปและไม่จำเป็นต้องเรียกวิธีการที่ใช้ร่วมกันของคลาสแม่ มีเพียงหนึ่งคำอธิบายประกอบ: @paramvalid
@paramvalid@responsebody@postmapping ("body") การตอบสนองสาธารณะ bodypost (@requestbody @valid testvo body, ผล bindingresult) {ส่งคืน responsevo ใหม่ ("bodypost", null);};2.2 คำอธิบายประกอบที่กำหนดเอง
คำอธิบายประกอบนี้เป็นคำอธิบายประกอบวิธีง่ายๆ
@Target (ElementType.Method) @retention (RetentionPolicy.runtime) สาธารณะ @Interface paramvalid {}2.3 ประเด็นสำคัญ! การใช้งานด้าน
คำอธิบายโดยละเอียดของส่วน:
@Before: ใช้วิธีการอธิบายประกอบ @Annotation (xx) วิธีนี้จะถูกเรียกเมื่อใดก็ตามที่คุณใช้คำอธิบายประกอบที่ต้องการ (@paramvalid)
JoinPoint: รับพารามิเตอร์ของวิธีการผ่าน joinPoint เพื่อรับเนื้อหาที่ตรวจสอบโดย bindingResult
โยกย้ายแพ็คเกจการตรวจสอบ: โยกย้ายการตรวจสอบดั้งเดิมไปยังแง่มุม: ValidrequestParams
ผลการตรวจสอบการตอบสนอง:
@ASPACT@ComponentPublic คลาส paramValidAspect {ส่วนตัว logger สุดท้าย logger log = loggerFactory.getLogger (paramValidAspect.class); @Before ("@annotation (paramValid)") โมฆะสาธารณะ paramValid (จุด JoinPoint, paramValid paramValid) {object [] paramobj = point.getArgs (); if (paramobj.length> 0) {ถ้า (paramobj [1] อินสแตนซ์ของ bindingResult) {bindingResult result = (bindingResult) paramobj [1]; Responsevo errormap = this.validrequestparams (ผลลัพธ์); 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 ()); เอาท์พุทเอาท์พุท = null; ลอง {output = response.getOutputStream (); errormap.setCode (null); string error = new gson (). tojson (errormap); log.info ("พารามิเตอร์ AOP ตรวจพบผิดปกติ" + ข้อผิดพลาด); output.write (error.getBytes ("UTF-8")); } catch (ioexception e) {log.error (e.getMessage ()); } ในที่สุด {ลอง {ถ้า (เอาต์พุต! = null) {output.close (); }} catch (ioexception e) {log.error (e.getMessage ()); }}}}}}}}} / *** การตรวจสอบ* / การตอบสนองส่วนตัว ValidRequestParams (ผล bindingResult) {ถ้า (ผลลัพธ์. รายการ <String> list = arrayList ใหม่ <> (); สำหรับ (objecterror objecterror: allerrors) {lists.add (objecterror.getDefaultMessage ()); } ส่งคืน ResponsEvo ใหม่ (httpstatus.bad_request.value (), "พารามิเตอร์ว่าง", รายการ); } return null; -2.4 ผลการทดสอบ
หลังจากอ่านสองผลลัพธ์ข้างต้นคุณสามารถเปรียบเทียบข้อดีของการใช้ Spring AOP กับ @Valid + BindingResult สำหรับการตรวจสอบ:
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น