บทความนี้แนะนำวิธีการแนะนำขั้นตอนการตรวจสอบโดยย่อวิธีลดปริมาณรหัสผ่านการตรวจสอบความถูกต้องที่กำหนดเองและปรับปรุงประสิทธิภาพการผลิต การกล่าวถึงเป็นพิเศษ: ถูกต้องของแอตทริบิวต์ประเภทที่ไม่ได้ใช้งาน, การประมวลผลวิธีการรับ, ความละเอียดแบบครบวงจรของข้อความแสดงข้อผิดพลาดการตรวจสอบความถูกต้อง
การดำเนินการตรวจสอบความถูกต้องในบทความนี้ได้รับความไว้วางใจจากการตรวจสอบความถูกต้องของไฮเบอร์เนตสำหรับการประมวลผล
การกำหนดค่าพื้นฐาน
POM แนะนำการพึ่งพา maven
<!-การตรวจสอบความถูกต้องเริ่มต้น-> <การพึ่งพา> <roupId> javax.validation </groupId> <ratifactId> การตรวจสอบความถูกต้อง-API </artifactid> <Sersion> 1.1.0.Final </เวอร์ชัน> <cersion> 5.4.0.final </เวอร์ชัน> </perctency> <!-การตรวจสอบความถูกต้องสิ้นสุด->
เพิ่มการกำหนดค่าการตรวจสอบความถูกต้อง
เพิ่มการกำหนดค่าต่อไปนี้ใน Spring-mvc-servlet.xml:
<MVC: annotation-driven daridator = "validator"> <bean id = "validator"> <property name = "ProviderClass" value = "org.hibernate.validator.hibernateValidator"/> <property name = "ValidationMessagesource
ข้อยกเว้นที่กำหนดเอง
ปรับแต่งข้อความแสดงข้อผิดพลาดการตรวจสอบความถูกต้องและข้อมูลที่ส่งคืนไปยังผู้โทรนั้นเป็นมิตรมากขึ้น การกำหนดค่าต่อไปนี้จะถูกเพิ่มลงใน ApplicationContext.xml:
<!-โหลดไฟล์ทรัพยากรข้อความ I18N-> <bean id = "MessagesOrce"> <ชื่อคุณสมบัติ = "basenames"> <list> <dalue> errormsg </value> <value> validation_error </value> </list>
เพิ่มไปยัง Project ClassPath: Validation_error_zh_cn.properties ไฟล์ทรัพยากร:
#ข้อผิดพลาด MSG สำหรับการตรวจสอบอินพุต#Commonfield.can.not.be.null = {ฟิลด์} ไม่สามารถเป็นฟิลด์ที่ว่างเปล่า can.not.be.empty = {ฟิลด์} ไม่สามารถว่างเปล่าหรือว่างเปล่าฟิลด์สตริงที่ว่างเปล่าได้ ValidationExceptionResovler การใช้งาน:
ValidationExceptionResovler.java
@slf4jpublic คลาส validationexceptionResovler ขยาย AbstracthandLerexceptionResolver {Public ValidationExceptionResovler () {// ตั้งค่าลำดับและเรียกใช้งาน this.setOrder (0); } /** * จัดการกับกรณีที่อาร์กิวเมนต์มีคำอธิบายประกอบด้วย {@code @valid} เช่น * an {@link} หรือ {@link} อาร์กิวเมนต์ล้มเหลวในการตรวจสอบความถูกต้อง * <p> * ตัวจัดการข้อยกเว้นการตรวจสอบความถูกต้องแบบกำหนดเอง * รับข้อความแสดงข้อผิดพลาดการตรวจสอบความถูกต้องเฉพาะและรวบรวม CommonResponse และกลับไปที่ผู้โทร * * @param คำขอปัจจุบันคำขอ http * @param การตอบกลับปัจจุบันการตอบกลับ http http * @param handler handler ที่ดำเนินการ * @@return modelandview ที่ว่างเปล่าระบุว่าข้อยกเว้นได้รับการจัดการ * @throws ioexception อาจโยนจากการตอบสนอง คำขอ httpservletRequest, การตอบสนอง httpservletResponse, ตัวจัดการวัตถุ) พ่น IOException {รายการ <ObjecTerror> ข้อผิดพลาด = bindingResult.getAllERrors (); StringBuffer ERRMSGBF = new StringBuffer (); สำหรับ (ข้อผิดพลาด objecterror: ข้อผิดพลาด) {String mass = error.getDefaultMessage (); errmsgbf.append (การนวด); errmsgbf.append ("||"); } string errmsgstring = errmsgbf.toString (); errmsgstring = errmsgstring.length ()> 2? errmsgstring.substring (0, errmsgstring.length () - 2): errmsgstring; log.error ("การตรวจสอบล้มเหลว! {}", errmsgstring); แผนที่ <string, Object> map = new treemap <string, object> (); map.put ("ความสำเร็จ", เท็จ); map.put ("errorcode", "9999"); map.put ("errormsg", errmsgstring); ModelAndView mav = new ModelandView (); MappingJackson2JsonView View = ใหม่ mapingjackson2jsonview (); View.setAttributesMap (แผนที่); mav.setView (ดู); กลับมา mav; } @Override Model และ View Doresolveexception (คำขอ httpservletrequest, การตอบสนอง httpservletResponse, ตัวจัดการวัตถุ, ข้อยกเว้น ex) {bindingResult bindingResult = null; if (ex instanceof methodArgumentNotValidexception) {bindingResult = ((methodArgumentNotValidexception) ex) .getBindingResult (); } อื่นถ้า (ตัวอย่างของ bindexception) {bindingResult = ((bindexception) ex) .getBindingResult (); } else {// ข้อยกเว้นอื่น ๆ , ละเว้น} ถ้า (bindingResult! = null) {ลอง {return handlemethodargumentNotValidexception (bindingResult, คำขอ, การตอบสนอง, handler); } catch (ioexception e) {log.error ("doresolveexception:", e); }} return null; - เพิ่ม @valid ในคอนโทรลเลอร์
@RequestMapping ("/ซื้อ")@responsebodypublic baseresponse ซื้อ (@requestbody @valid buyflowerrequest คำขอ) โยนข้อยกเว้น {// ...... } เพิ่มคำอธิบายประกอบการตรวจสอบความถูกต้องลงในแอตทริบิวต์ที่ต้องมีการตรวจสอบความถูกต้องในการร้องขอถั่ว
@setter@getterpublic คลาส buyflowerRequest {@NotEmpty (message = "{name.can.not.be.null}") ชื่อสตริงส่วนตัว;} การตรวจสอบความถูกต้องของวัตถุทุติยภูมิ
วิธีการเขียนข้างต้นสามารถตรวจสอบแอตทริบิวต์ประเภทพื้นฐานของ BuyflowerRequest เท่านั้น แต่ไม่มีวิธีที่จะตรวจสอบคุณสมบัติของแอตทริบิวต์วัตถุ หากคุณต้องการตรวจสอบแอตทริบิวต์ของวัตถุทุติยภูมิคุณต้องเพิ่ม @Valid และคำอธิบายประกอบการตรวจสอบความถูกต้องเฉพาะลงในวัตถุรองและแอตทริบิวต์วัตถุรองในเวลาเดียวกัน
วิธีการเขียนต่อไปนี้:
@setter @getterpublic คลาส buyflowerRequest {@NotEmpty (field = "bianname") ชื่อสตริงส่วนตัว; @min (field = "ราคา" มูลค่า = 1) ราคา int ส่วนตัว; @NotNull รายการส่วนตัว <PayType> PayTypelist;} @setter @getterpublic คลาส paytype {@valid @min (value = 1) pistype int ส่วนตัว; @valid @min (value = 1) payamount ส่วนตัว int ส่วนตัว;} ลดจำนวนการเข้ารหัสเพิ่มเติม
เพื่อลดภาระงานที่เข้ารหัสผ่านคำอธิบายประกอบการตรวจสอบความถูกต้องที่กำหนดเองลองส่งชื่อการตรวจสอบความถูกต้องของไฟล์ทรัพยากรของข้อความแสดงข้อผิดพลาดซึ่งจะหลีกเลี่ยงการเขียนเทมเพลตข้อความที่แตกต่างกันสำหรับแต่ละโดเมน
นี่คือตัวอย่างของการเขียนใหม่ @NotNull:
1. กำหนดคำอธิบายประกอบการตรวจสอบความถูกต้องโปรดทราบว่าฟิลด์ () ถูกเพิ่มเข้ามาเมื่อเทียบกับคำอธิบายประกอบแบบดั้งเดิมซึ่งใช้เพื่อส่งผ่านชื่อที่ยื่นที่ตรวจสอบแล้ว
notnull.java
@Target ({ElementType.method, ElementType.field, ElementType.annotation_type, ElementType.Constructor, ElementType.parameter})@constraint (ถูกต้องโดย = {notnullvalidator.class})@retention ข้อความสตริง () ค่าเริ่มต้น "{field.can.not.be.null}"; คลาส <?> [] กลุ่ม () ค่าเริ่มต้น {}; ชั้นเรียน <? ขยาย payload> [] payload () ค่าเริ่มต้น {};} 2. กำหนดตัวตรวจสอบตัวตรวจสอบความถูกต้องทั้งหมดใช้อินเทอร์เฟซ ConstraintValidator:
notnullvalidator.java
คลาสสาธารณะ NotnullValidator ใช้ constraintValidator <notnull, object> {@Override โมฆะสาธารณะเริ่มต้น (notnull คำอธิบายประกอบ) {} @Override บูลีนสาธารณะ isValid (Object Str, ConstraintValidatorContext ข้อ จำกัด - 3. เพิ่มคำอธิบายประกอบการตรวจสอบความถูกต้องให้กับการยื่นให้ความสนใจในการระบุมูลค่าที่ยื่น หากข้อความไม่มีข้อกำหนดส่วนบุคคลคุณไม่จำเป็นต้องระบุ ส่วนประกอบการตรวจสอบความถูกต้องจะกรอกข้อความเริ่มต้นด้วยตัวเอง
buyflowerrequest.java
@setter @getterpublic คลาส buyflowerRequest {@NotEmpty (field = "bianname") ชื่อสตริงส่วนตัว; @min (field = "ราคา", ค่า = 1) ราคา int ส่วนตัว;} หมายเหตุ: คำอธิบายประกอบ @NotNull รองรับการตรวจสอบรายการพิเศษแล้ว สำหรับโหนดประเภทรายการถ้า list == null || list.size () == 0 จะส่งคืนเท็จและการตรวจสอบล้มเหลว ปัจจุบัน @NotNull, @NotEmpty, @min, @Max Annotations ได้รับการปรับแต่งตามแนวคิดนี้และสามารถพบได้ในโครงการสินค้า
รองรับคำขอรับ
ตัวอย่างข้างต้นคือคำขอโพสต์ทั้งหมด @requestbody สามารถแก้ไขคำขอโพสต์ได้ แต่พวกเขาไม่สนับสนุนคำขอรับ อ่านเอกสารและซอร์สโค้ดของฤดูใบไม้ผลิและพบว่า @ModelAttribute สามารถแก้ไขได้รับการร้องขอในถั่วและการตรวจสอบความถูกต้องสนับสนุน สำหรับรายละเอียดคุณสามารถอ่านซอร์สโค้ดสปริง: ModelattributeMethodprocessor.resolveargument ()
ตัวอย่างการใช้งาน:
@RequestMapping (value = "/buy", method = requestMethod.get) @ResponseBodyPublic Baseresponse รายละเอียด (@valid @modelattribute DetailflowerRequest คำขอ) โยนข้อยกเว้น Response.setName (request.getName ()); return resultFactory.success (การตอบสนอง, baseresponse.class);}
สิ่งที่ต้องทำ
1. ขยายการตรวจสอบความถูกต้องตามสถานการณ์ทางธุรกิจเช่น: รูปแบบวันที่จำนวนเงิน ฯลฯ
2. สนับสนุนการตรวจสอบความถูกต้องของการตรวจสอบความสัมพันธ์หลายสาขา
ไฟล์แนบ: รหัสคีย์การใช้งานการตรวจสอบความถูกต้องของฤดูใบไม้ผลิ
@requestbody
คลาสการใช้งาน: RequestResponseBodyMethodProcessor.java
วัตถุสาธารณะ RELEVEARGUMENT (พารามิเตอร์ MethodParameter, ModelAndViewContainer MavContainer, WebRequest NativeWebRequest, WebDatabinderFactory BinderFactory) โยนข้อยกเว้น {Object arg = this ชื่อสตริง = conventions.getVariableNameForAmeter (พารามิเตอร์); WebDatabinder Binder = BindFactory.CreateBinder (WebRequest, Arg, ชื่อ); if (arg! = null) {this.validateifapplicable (สารยึดเกาะ, พารามิเตอร์); if (binder.getBindingResult (). haserrors () && this.isbindexceptionRequired (Binder, พารามิเตอร์)) {โยน methodArgumentNotValidexception ใหม่ (พารามิเตอร์, binder.getebindingresult ()); }} mavcontainer.addattribute (bindingResult.model_key_prefix + ชื่อ, Binder.getBindingResult ()); return arg;} @modelattuite
ระดับการใช้งาน: ModelattributeMethodprocessor.java
วัตถุสุดท้ายของวัตถุสุดท้าย RELEVEARGUMENT (พารามิเตอร์ MethodParameter, ModelAndViewContainer MavContainer, NativeWebRequest WebRequest, WebDatabinderFactory BinderFactory) โยนข้อยกเว้น {ชื่อสตริง = modelfactory.getNameForMeter (พารามิเตอร์); Attribute Object = MavContainer.ContainSattribute (ชื่อ)? mavcontainer.getModel (). รับ (ชื่อ): this.createattribute (ชื่อ, พารามิเตอร์, bindfactory, webRequest); if (! mavcontainer.isbindingDisabled (ชื่อ)) {modelattribute ann = (modelattribute) parameter.getParameterannotation (modelattribute.class); if (ann! = null &&! ann.binding ()) {mavcontainer.setBindingDisabled (ชื่อ); }} WebDatabinder Binder = bindFactory.CreateBinder (WebRequest, แอตทริบิวต์, ชื่อ); if (binder.getTarget ()! = null) {ถ้า (! mavcontainer.isbindingDisabled (ชื่อ)) {this.bindrequestparameters (Binder, WebRequest); } this.validateifapplicable (สารยึดเกาะ, พารามิเตอร์); if (binder.getBindingResult (). haserrors () && this.isbindexceptionRequired (Binder, พารามิเตอร์)) {โยน bindexception ใหม่ (binder.getBindingResult ()); }} แผนที่ <สตริงวัตถุ> bindingResultModel = binder.getBindingResult (). getModel (); mavcontainer.removeattributes (bindingResultModel); mavcontainer.addallattributes (bindingResultModel); return Binder.ConvertifneCESEY (binder.getTarget (), parameter.getParameterType (), พารามิเตอร์);}ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น