เมื่อเร็ว ๆ นี้มีความจำเป็นที่จะต้องส่งข้อมูลแบบไดนามิกนั่นคือคุณต้องวิเคราะห์และส่งข้อมูลการกำหนดเขตข้อมูลข้อมูลก่อนที่คุณจะสามารถชี้แจงประเภทของฟิลด์เฉพาะที่เกี่ยวข้องแล้วทำการแปลงประเภทข้อมูลและการตรวจสอบความถูกต้องของฟิลด์ จากนั้นหลังจากทำการประมวลผลธุรกิจส่งฐานข้อมูลและพัฒนาชุดของตรรกะการตรวจสอบด้วยตัวเองวัฏจักรนั้นยาวเกินไป ดังนั้นจึงมีการวิเคราะห์หลักการดำเนินการตามการตรวจสอบความถูกต้องของฤดูใบไม้ผลิ ที่นี่กระบวนการวิเคราะห์หลักการตรวจสอบความถูกต้องของฤดูใบไม้ผลิจะถูกบันทึกโดยไม่ต้องลงรายละเอียด
วิธีใช้การตรวจสอบสปริง
ตรวจสอบว่าถั่วเป็นไปตามข้อกำหนด JSR-303 หรือไม่เมื่อเริ่มต้นถั่วฤดูใบไม้ผลิ
1. เพิ่ม BeanvalidationPostProcessor Bean ด้วยตนเอง
2. กำหนดกฎการตรวจสอบในคลาสโมเดลเช่น @max, @min, @NotEmpty
3. ประกาศถั่วรหัสที่ครอบคลุมมีดังนี้:
@BeanPublic BeanPostProcessor BeanValidationPostProcessor () {ส่งคืน BeanValidationPostProcessor ใหม่ ();}@BeanPublic USERMODEL GETUSERMODEL () {USERMODEL USERMODEL = ใหม่ USERMODEL (); USERMODEL.SETUSERNAME (NULL); usermodel.setPassword ("123"); ส่งคืน usermodel;} @dataclass usermodel {@notnull (message = "ชื่อผู้ใช้ไม่สามารถเป็น null") @pattern (regexp = "[a-za-z0-9 _] {5,10}", message = "ชื่อผู้ใช้ผิดกฎหมาย") username ส่วนตัว; @Size (min = 5, max = 10, message = "ความยาวของรหัสผ่านผิดกฎหมาย") รหัสผ่านสตริงส่วนตัว;}4. BeanValidationPostProcessor มีคุณสมบัติประเภทบูลีนหลังการกำหนดค่าซึ่งเป็นเท็จโดยค่าเริ่มต้น หากเป็นเท็จถั่วจะได้รับการตรวจสอบในกระบวนการ postprocessbeforeinitialization มิฉะนั้นถั่วจะได้รับการตรวจสอบในกระบวนการ postprocessafterinitialization
5. การตรวจสอบนี้ใช้ตรรกะ BeanPostProcessor ของ Spring
6. ตรวจสอบว่าวิธีการ dovalidate เรียกว่าและการตรวจสอบความถูกต้องของการโทรเพิ่มเติม ตัวตรวจสอบความถูกต้องเริ่มต้นคือ hibernatevalidator แพ็คเกจการตรวจสอบความถูกต้องของ API เป็นข้อกำหนด Java และข้อกำหนดสปริงเริ่มต้นจะถูกนำมาใช้เป็นแพ็คเกจ Hibernate-Validator Hibernate ที่ไม่ใช่ orm Hibernate นี้
Void Dovalidate ที่ได้รับการป้องกัน (Object Bean) {assert.state (this.validator! = null, "ไม่มีชุดตรวจสอบความถูกต้อง"); ตั้งค่า <constraintViolation <object>> result = this.validator.validate (ถั่ว);7. hibernatevalidator เรียก chalidatorFactoryImpl โดยค่าเริ่มต้นเพื่อสร้างตัวตรวจสอบความถูกต้องจากนั้นขยาย DistalatorFactoryImpl
สนับสนุนข้อกำหนด JSR-303 ระดับวิธีการ
1. เพิ่ม MethodValidationPostProcessor Bean ด้วยตนเอง
2. เพิ่ม @Validated คำอธิบายประกอบในชั้นเรียน (รองรับคำอธิบายประกอบที่กำหนดเองและมันจะถูกส่งผ่านเมื่อสร้าง methodValidationPostProcessor Bean)
3. เพิ่มคำอธิบายประกอบการตรวจสอบลงในพารามิเตอร์ของวิธีการเช่น @max, @min, @NotEmpty, @NotNull ฯลฯ
@Component@ValidatedPublic คลาส beanformethodvalidation {โมฆะสาธารณะตรวจสอบ (@notexpty ชื่อสตริง, @min (10) อายุ int) {system.out.println ("ตรวจสอบชื่อ:" + ชื่อ + ", อายุ:" + อายุ); -4. MethodValidationPostProcessor ใช้ AOP เพื่อทำการโทรไปยังวิธีการ
โมฆะสาธารณะ AfterPropertIesset () {PointCut PointCut = ใหม่ `คำอธิบายประกอบ` คำอธิบายประกอบการปัด proptionCut` (this.validatedAnnotationType, true); this.advisor = new `defaultpointcutvisor` (pointcut, createMethodValidationAdvice (this.Validator));} คำแนะนำที่ได้รับการป้องกัน createMethodValidationAdvice (@Nullable Validator Validator) {return5. เลเยอร์พื้นฐานยังเรียก ValidatorFactoryImpl โดยค่าเริ่มต้นเพื่อสร้างตัวตรวจสอบและตัวตรวจสอบการตรวจสอบเสร็จสิ้น
ตรรกะการตรวจสอบการโทรโดยตรงเช่น
บุคคลชั้นเรียนสาธารณะ {@NotNull (ข้อความ = "เพศไม่สามารถว่างเปล่า") เพศส่วนตัวเพศส่วนตัว; @min (10) อายุจำนวนเต็มส่วนตัว; ... } chalidatorFactory ValidatorFactory = การตรวจสอบความถูกต้อง. person (); person.setGender (เพศชาย); validator.validate (บุคคล);เช่นเดียวกับข้างต้นการโทรเริ่มต้นไปยัง DistatorFactoryImpl ถูกเรียกให้สร้างตัวตรวจสอบความถูกต้องและตัวตรวจสอบความถูกต้องของการตรวจสอบที่เฉพาะเจาะจง
ใช้คำอธิบายประกอบที่ถูกต้องหรือผ่านการตรวจสอบเพื่อใส่หมายเหตุประกอบพารามิเตอร์ที่จะตรวจสอบในพารามิเตอร์เมธอดสปริงคอนโทรลเลอร์
1. ก่อนอื่นให้คุ้นเคยกับคำขอและกระบวนการโทรของฤดูใบไม้ผลิ
2. คุณจะเห็นว่าการตรวจสอบพารามิเตอร์จะดำเนินการในระหว่างกระบวนการของพารามิเตอร์การร้องขอการประมวลผลตัวแก้ไขต่างๆ
3. เลเยอร์พื้นฐานเรียกวิธีการตรวจสอบความถูกต้องของ databinder อย่างสม่ำเสมอ
4. บทบาทของ Databinder: สารยึดเกาะที่อนุญาตให้ตั้งค่าคุณสมบัติลงบนวัตถุเป้าหมายรวมถึงการสนับสนุนสำหรับการตรวจสอบความถูกต้องและการวิเคราะห์ผลการเชื่อมโยงนั่นคือสารยึดเกาะประมวลผลพารามิเตอร์รูปแบบสตริงที่ส่งโดยคำขอและแปลงเป็นประเภทที่เซิร์ฟเวอร์ต้องการจริงๆ สารยึดเกาะให้การสนับสนุนสำหรับการตรวจสอบความถูกต้องและสามารถจัดเก็บผลการตรวจสอบ
5. ตัวตรวจสอบความถูกต้องของ Databinder เริ่มต้นในตัวกำหนดค่า WebBindingInitializer โดยค่าเริ่มต้น OptionAlvalidatorFactoryBean ใช้โดยค่าเริ่มต้น ถั่วนี้สืบทอด LocalValidatorFactoryBean LocalValidatorFactoryBean ผสมผสานข้อมูลการตรวจสอบต่าง ๆ เช่น ValidatorFactory คุณสมบัติการตรวจสอบที่กำหนดเอง ฯลฯ และใช้ ValidatorFactoryImpl เพื่อรับตัวตรวจสอบโดยค่าเริ่มต้น
เมื่อมาถึงจุดนี้เบาะแสทั้งหมดชี้ไปที่ ValidatorFactoryImpl การวิเคราะห์ต่อไปนี้มีดังต่อไปนี้
Public Validator `getValidator` () {return` createValidator` (constraintValidatorManager.getDefaultConstraintValidatorFactory (), valueExtractorManager, ValidatorFactoryScopedCopedCopedColaTraintroticAntrotItratiOn ValueextractorManager ValueExtractorManager, ValidatorFactoryScopedContext ValidatorFactoryScopedContext, MethodValidationConfiguration MethodValidationConfiguration) {BeanMetadatamanager BeanMetAdatamanager = BeanMetadatamanagers.CumputeIfaBesent ValidatorFactoryScopedContext.getParameterNameProvider (), ValueExtractorManager, MethodValidationConfiguration), คีย์ -> New Beanmetadatamanager (`` constrainthelper`, ExecutableHelper ValidationOrderGenerator, buildDataproviders (), methodValidationConfiguration)); return `ใหม่ chalidatorimpl` (ConstraintValidatorFactory, BeanMetAdatamanager, ValueExtractorManager, ConstraintValidatorManager, การตรวจสอบความถูกต้องของผู้ตรวจสอบ, การตรวจสอบความถูกต้อง Messages.validatedObjectMustNotBenull ()); SanityCheckGroups (กลุ่ม); ValidationContext <t> ValidationContext = `getValidationContextBuilder (). forValidate (วัตถุ)`; if (! validationContext.getRootBeanMetadata (). hasConstraints ()) {return collections.empyset (); } qualidation vertive ordicorder = กำหนด groupvalidation order (กลุ่ม); ValueContext <?, Object> valueContext = `valueContext.getLocaleXecutionContext` (validatorsCopedContext.getParameterNameProvider (), วัตถุ, validationContext.getRootBeanMetAdata () return validateInconText (ValidationContext, ValueContext, Validationorder);}1. getValidator-> createValidator-> validatorimpl-> ตรวจสอบความถูกต้อง
ในระหว่างกระบวนการดำเนินการ, beanmetadatamanager, validationContext, valueContext และเนื้อหาอื่น ๆ ถูกห่อหุ้มซึ่งเป็นข้อมูลบริบทที่จะใช้ในระหว่างการตรวจสอบเช่นรายการการตรวจสอบทั้งหมดของถั่วที่จะตรวจสอบ (รวมถึงคลาสแม่และอินเทอร์เฟซ) ฯลฯ และเนื้อหาค่อนข้างซับซ้อน
2. การตรวจสอบกลุ่มจะถูกละเว้นและการประมวลผลกลุ่มเริ่มต้นคือ ValidateConstraintsfordefaultGroup-> ValidateConstraintsforsingleDefaultGroupelement-> ValidateMetaconstraint (หมายเหตุ: metaconstraint
3. ดำเนินการต่อเพื่อเรียกวิธีการ dovalidateConstraint ของ metaconstraint และปฏิบัติตามข้อ จำกัด ที่แตกต่างกันตามประเภทคำอธิบายประกอบที่แตกต่างกัน
สาธารณะคงที่ <u ขยายคำอธิบายประกอบ> ConstraintTree <u> ของ (ConstraintDescriptorimpl <u> PossingDescriptor, ประเภทที่ตรวจสอบแล้ว Valuetype) {ถ้า (posposingDescriptor.getCompositraintInplsItraintImplaIntrede } else {ส่งคืน New ComposingConstraintTree <> (PomeScosedDescriptor, ValidatedValUetype); -4. ฉันควรไปอะไรง่ายๆและควรแต่งอะไร? เพราะทั้งคู่เรียกวิธี 'getInitializedConstraintValidator' ของข้อ จำกัด ขั้นตอนนี้ใช้เพื่อให้ได้ตัวตรวจสอบที่สอดคล้องกับคำอธิบายประกอบ (เช่น decimalmax, notempty ฯลฯ ) และเริ่มต้นผู้ตรวจสอบ
5. คลาส ConstraintHelper รักษาตัวตรวจสอบความถูกต้องทั้งหมดและจำแนกตามคำอธิบายประกอบการตรวจสอบ (เช่น DecimalMax) คลาสคำอธิบายของผู้ตรวจสอบความถูกต้องจะรักษาเทมเพลตทั่วไปของผู้ตรวจสอบ (เช่น BigDecimal) ดังนี้:
PutConstraints (TMPCONSTRAINTS, DECIMALMAX.CLASS, Array.ASLIST (DECIMALMAXVALIDATORFORBIGDECIMAL.CLASS, DECIMALMAXVALIDATORFORBIGINTEGENDLASS, DECIMALMAXVALIDATORFORDOUBLE.Class DecimalMaxValidatorForNumber.class, DecimalMaxValidatorForChareSequence.class, DecimalMaxValidatorFormonetaryAmount.class));
เมื่อได้รับการตรวจสอบความถูกต้องของคลาสถั่วที่เฉพาะเจาะจงก่อนอื่นจะได้รับการตรวจสอบทั้งหมดตามคำอธิบายประกอบ วิธีการที่สอดคล้องกันคือ ConstraintManager.FindMatchingValidAtordescriptor จากนั้นรับตัวตรวจสอบที่ไม่ซ้ำกันตามประเภทของวัตถุที่ถูกตรวจสอบ
6. จากนั้น initializeValidator ตามข้อมูลบริบทจากนั้นเรียกใช้วิธี isvalid ของผู้ตรวจสอบความถูกต้องเพื่อตรวจสอบ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น