คู่มือแพ็คเก็ตและการกำหนดค่า
นำเข้าแพ็คเกจ JSR 303 และแพ็คเกจที่ถูกต้องไฮเบอร์เนต
<การพึ่งพา> <roupId> org.hibernate.validator </groupId> <ratifactId> hibernate-validator </artifactid> <version> 6.0.5.final </เวอร์ชัน> </erperency> <cersion> 2.0.0.final </เวอร์ชัน> </derctency>
การกำหนดค่า Springboot
ทรัพยากร/application.yml ข้อความทรัพยากรไฟล์การกำหนดค่าการประมวลผลระหว่างประเทศ
ฤดูใบไม้ผลิ:
ข้อความ:
basename: ฐาน, todo # resource files base.properties และ todo.properties, คั่นด้วยเครื่องหมายจุลภาค
การเข้ารหัส: ต้องระบุการเข้ารหัสการแยกวิเคราะห์ UTF-8 # มิฉะนั้นรหัสที่อ่านไม่ออกภาษาจีน
กำหนดค่าในคลาส Startup Springboot
@springbootapplicationpublic คลาสแอปพลิเคชันขยาย WebMvCconFigurerAdapter {@Value ("$ {Spring.messages.baseName}") ชื่อสตริงส่วนตัว; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (application.class, args); } @Bean @Primary Public MessagesOrce MessagesOrce () {ResourceBundleMessagesOrce ResourceBundLeMessageSource = ใหม่ ResourceBundLeMessageSource (); ResourceBundleMessagesource.setUsecodeasDefaultMessage (เท็จ); ResourceBundleMessagesource.setDefaultEncoding ("UTF-8"); // ซ้ำคำจำกัดความ ResourceBundleMessageSource.setBasenames (basename.split (",")); ส่งคืน ResourceBundleMessagesource; } @Bean @Primary Public LocalValidatorFactoryBean Validator () {localValidatorFactoryBean ValidatorFactoryBean = ใหม่ localValidatorFactoryBean (); ValidatorFactoryBean.setProviderClass (hibernatevalidator.class); duridatorfactoryBean.setValidationMessageSource (MessagesOrce ()); return validatorfactorybean; } @Override Public Validator getValidator () {return validator (); } / *** การตรวจสอบพารามิเตอร์เดียวที่ระดับวิธีการเปิดใช้งาน* / @bean Public MethodValidationPostProcessor MethodValidationPostProcessor () {ส่งคืน MethodValidationPostProcessor ใหม่ (); -เราประมวลผลข้อยกเว้นที่ไม่สามารถผ่านพารามิเตอร์การตรวจสอบและไม่สามารถส่งผ่านการโยนซึ่งผ่านการจับข้อยกเว้นแบบครบวงจร
@controllerAdvice @componentPublic คลาส bindvalidexceptionhandler {@ResponSestatus (value = httpstatus.ok) @exceptionhandler (constraintViolationException.class) สาธารณะ @ResponseBody MSG HADLECONTRAINTVIOLATIONException e.getConstraintViolations (). iterator (). next (). getMessagetemplate (); return msg.error (Messagetemplate); } @ResponSestatus (value = httpstatus.ok) @exceptionhandler (bindexception.class) สาธารณะ @ResponseBody MSG HandleBindException (BindException E) {bindingResult bindingResult = e.getBindingResult (); String className = bindingResult.getTarget (). getClass (). getName (); Fielderror next = bindingResult.getFielderRors (). iterator (). next (); String fieldName = next.getField (); สตริง defaultMessage = next.getDefaultMessage (); if (pattern.compile ("unglemalargumentException: ไม่มี enum"). matcher (defaultMessage) .find ()) {matcher matcher = pattern.compile ("สำหรับค่า '(.*?)'"). matcher (defaultMessage); if (matcher.find ()) {defaultMessage = "ประเภท enum ไม่สามารถพบ [" + matcher.group (1) + "]"; }} return msg.error (defaultMessage); } @ResponSestatus (value = httpstatus.ok) @exceptionhandler (validerror.class) สาธารณะ @ResponseBody msg handlevaliderror (Validerror e) {return msg.error (e.getMessage ()); -ทรัพยากร/base.propertie
creatorId = ID ผู้สร้างไม่น้อยกว่า {value}
modifierId = modifier id ไม่น้อยกว่า {value}
ทรัพยากร/todo.properties
todo.privateid.min = ID ส่วนตัวไม่น้อยกว่า {value}
ใช้คำอธิบายประกอบบนฟิลด์ถั่วโดยที่อินเทอร์เฟซ C และ S ในกลุ่มอ้างถึงตัวย่อของคอนโทรลเลอร์และบริการซึ่งรวมถึงอินเตอร์เฟสแทรกอินเตอร์เฟสอัปเดต ฯลฯ ซึ่งเป็นอนุสัญญาที่กำหนดเองทั้งหมด
/*** ID ส่วนตัวเป็นคีย์ต่างประเทศที่แสดงหลายตารางเช่นงานโครงการ/งานที่ไม่ใช่โครงการ/ความเสี่ยง/ปัญหา/การตรวจสอบคำถามที่ต้องทำ*/@min (value = 1, message = "{toDo.privateid.min}", กลุ่ม = {c.insert.class */@min (value = 1, message = "{creatorid}", กลุ่ม = {s.insert.class}) ผู้สร้างยาวส่วนตัว; การตรวจสอบเลเยอร์การควบคุมตัวควบคุม@ตรวจสอบความถูกต้อง@restcontroller@requestmapping ("toDo") @getMapping ("getVo") Public MSG GetVo (@min (value = 1, message = "การทำ ID ไม่ต้องน้อยกว่า 1") @requestParam (จำเป็น = false, defaultValue = "0") id ยาว) {ส่งคืน this.todoservice.getVo } @PostMapping ("เพิ่ม") ข้อความสาธารณะเพิ่ม (@Validated ({c.insert.class}) สิ่งที่ต้องทำ) {ส่งคืน this.todoservice.add (todo); -@Validated ({c.insert.class}) ประกาศเพื่อเปิดใช้งานกลุ่มการตรวจสอบเกี่ยวกับคำอธิบายประกอบถั่วและกลุ่มการตรวจสอบอื่น ๆ จะไม่ทำการตรวจสอบซึ่งสามารถแยกแยะได้สำหรับการตรวจสอบแยกต่างหาก
ตัวอย่างเช่นหากไม่มีเอนทิตีและประเภทข้อมูลพื้นฐานเพียงชนิดเดียวก็สามารถตรวจสอบได้ แต่ต้องปฏิบัติตามเงื่อนไขสามประการ:
ยืนยันด้วยตัวเอง
การตรวจสอบเลเยอร์บริการ AOP บริการ AOP
คลาสเครื่องมือ Validutil
จำเป็นต้องสแกนและลงทะเบียนเป็นกรณีเดียวโดย Springboot
@ComponentPublic Class Validutil {@autowired Private Validator Validator; สาธารณะ <t> set <constraintViolation <t>> ตรวจสอบ (t Object, คลาส <?> ... กลุ่ม) {return validator.validate (วัตถุ, กลุ่ม); } สาธารณะ <t> set <constraintViolation <t>> validateValue (คลาส <t> beantype, สตริงคุณสมบัติชื่อวัตถุ, คลาส, คลาส <?> ... } / *** ตรวจสอบพารามิเตอร์และส่งคืนพรอมต์ข้อผิดพลาดครั้งแรก* @param t วัตถุที่ผ่านการตรวจสอบ* @param กลุ่มที่ตรวจสอบแล้ว* @param <t> ประเภทดั้งเดิมก่อนที่จะลบวัตถุ* @return ข้อผิดพลาดข้อผิดพลาดแรก* / สาธารณะ <t> โมฆะ validandreturnfirsterRortips if (quaridate.size ()> 0) {constraintViolation <t> next = validate.iterator (). next (); String message = next.getRootBeanClass (). getName () + "-" + next.getPropertyPath () + "-" + next.getMessage (); โยน ValidError ใหม่ (ข้อความ); }} / *** ตรวจสอบพารามิเตอร์และส่งคืนพรอมต์ข้อผิดพลาดครั้งแรก* @param targetClass ประเภทคลาสของวัตถุที่ตรวจสอบแล้ว* @param ชื่อ FieldName ที่ต้องตรวจสอบความถูกต้อง* @param OBJ ค่าคุณสมบัติ* @param กลุ่มการตรวจสอบกลุ่ม* @param <t> ประเภทต้นฉบับ FieldName, Object OBJ, คลาส <s?> ... กลุ่ม) {SET <ConstraINTVIOLATION <t >> Validate = Validator.ValidateValue (TargetClass, FieldName, OBJ, กลุ่ม); if (varidate.size ()> 0) {String message = targetClass.getName () + "-" + fieldName + "-" + varidate.iterator (). next (). getMessage (); โยน ValidError ใหม่ (ข้อความ); -การกำหนดค่า AOP
หลักการหลักคือการใช้วิธี AOP Intercept เพื่อดำเนินการพารามิเตอร์และรับคำอธิบายประกอบสำหรับพารามิเตอร์ จากนั้นใช้คลาสเครื่องมือเพื่อตรวจสอบพารามิเตอร์ หากการตรวจสอบล้มเหลวข้อผิดพลาดที่กำหนดเองจะถูกส่งโดยตรงและข้อผิดพลาดที่กำหนดเองได้รับการประมวลผลทั่วโลก
@ASPACT @ComponentPublic Class Validatoraop {@autowired Private Validutil Validutil; /*** กำหนดกฎการสกัดกั้น: สกัดกั้นคลาสทั้งหมดด้านล่างแพ็คเกจ com.service มีวิธีการที่มีคำอธิบายประกอบ @Service */ @pointcut ("การดำเนินการ (*com.service ..*(.. )) และ @Annotation (org.springframework.stereotype.service)") โมฆะสาธารณะควบคุม protctoDpointcut () {}/ ***การใช้งานเฉพาะของ interceptor*/ @around ( นอกจากนี้คุณยังสามารถเขียน "การดำเนินการ (* com.xjj ......... )" ลงใน Interceptor วัตถุสาธารณะนี้ (ดำเนินการ joinpoint pjp) {methodSignature methodSignature = (methodSignature) pjp.getSignature (); วิธีการ = methodSignature.getMethod (); คำอธิบายประกอบ [] [] argannotations = method.getParameterannotations (); วัตถุ [] args = pjp.getargs (); สำหรับ (int i = 0; i <args.length; i ++) {สำหรับ (คำอธิบายประกอบคำอธิบายประกอบ: argannotations [i]) {ถ้า (ตรวจสอบความถูกต้อง. class.isinstance (คำอธิบายประกอบ)) {ตรวจสอบความถูกต้อง = (ตรวจสอบแล้ว) คำอธิบายประกอบ; ชั้นเรียน <?> [] กลุ่ม = ตรวจสอบความถูกต้อง value (); Validutil.validandreturnfirsterRortips (args [i], กลุ่ม); }} ลอง {return pjp.proceed (args); } catch (throwable throwable) {throwable.printstacktrace (); } return true; -ตรวจสอบคำอธิบายประกอบ @min @notnull วิธีการใช้งาน
ไม่สามารถเขียนบนคลาสการใช้งานสามารถใช้คำอธิบายประกอบได้เฉพาะในส่วนต่อประสาน
โดยทั่วไปเช่นเดียวกับคอนโทรลเลอร์
@ValidatedPublic อินเตอร์เฟส todoservice { / *** Query Single to-do* @param id หมายเลขซีเรียล* @@return single to-do* / msg getvo (@min (value = 1, message = "to-do id ไม่น้อยกว่า 1") id ยาว); / *** เพิ่มข้อมูล* @param todo object*/ msg เพิ่ม (@validated ({s.insert.class}) สิ่งที่ต้องทำ);แบ่งปันคำอธิบายประกอบการตรวจสอบที่กำหนดเองไม่กี่
การตรวจสอบสตริงว่าง
แพ็คเกจ javax.validation.constraints; นำเข้า Javax.validation.constraint; นำเข้า Javax.validation.constraintvalidator; นำเข้า Javax.validation.constraintvalidatorContext; นำเข้า Javax.validation.payload; ไม่สามารถใช้และจำเป็นต้องเขียนใหม่ แพ็คเกจไม่สามารถเปลี่ยนแปลงได้ */@documented@constraint (ตรวจสอบแล้ว = {notblank.notblankvalidator.class})@target ({elementtype.field, elementType.annotation_type, elementType.parameter})@retention (retentionpolicy.runtime) ข้อความสตริง () ค่าเริ่มต้น "{notblank}"; ชั้นเรียน <? ขยาย payload> [] payload () ค่าเริ่มต้น {}; คลาส notblankvalidator ใช้ constraintValidator <notblank, object> {public notblankvalidator () {} @Override โมฆะสาธารณะเริ่มต้น (notblank จำกัด การกำหนดค่า) {} @Override public Boolean isValid (ค่าวัตถุ -พิมพ์การตัดสินเพื่อพิจารณาว่าประเภทเป็นหนึ่งในค่าคุณสามารถปรับแต่งการตัดสินตามกลุ่มการตรวจสอบ
ทรัพยากร/todo.propertiestodo.todotype.insert = เมื่อเพิ่มใหม่ประเภทที่ต้องทำสามารถเป็นหนึ่งในงานที่ไม่ใช่โครงการงานโครงการหรือปัญหา todo.todotype.update = เมื่อแก้ไขประเภทที่ต้องทำสามารถเป็นหนึ่งในความเสี่ยงและตรวจสอบปัญหาที่ต้องทำ Bean/*** todotype0non-project task1project task2problem3Risk4ReviewTodotypEvalid (value = {"0", "1", "2"}, ข้อความ = "toDo.todotype.insert}" "4"}, message = "{toDo.todotype.update}", กลุ่ม = {c.update.class, s.update.class}) สตริงส่วนตัว todotype;คำอธิบายประกอบที่กำหนดเอง
@documented@constraint (rigidatedby = {todotypevalid.todotypevalidfactory.class})@target ({elementtype.field, elementtype.annotation_type, elementtype.parameter})@retention todotypevalid {ข้อความสตริง () ค่าเริ่มต้น "โปรดป้อนประเภทที่ถูกต้อง"; สตริง [] ค่า () ค่าเริ่มต้น {}; คลาส <?> [] กลุ่ม () ค่าเริ่มต้น {}; ชั้นเรียน <? ขยาย payload> [] payload () ค่าเริ่มต้น {}; คลาส todotypevalidfactory ใช้ constraintValidator <todotypevalid, string> {สตริงส่วนตัว [] คำอธิบายประกอบ; @Override โมฆะสาธารณะเริ่มต้น (todotypevalid todostatusValid) {this.annotationValue = todostatusValid.value (); } @Override บูลีนสาธารณะ isvalid (ค่าสตริง, บริบท constraintValidatorContext) {ถ้า (array.aslist (คำอธิบายประกอบ). กลับเท็จ; }} @Target ({ElementType.field, ElementType.Annotation_Type, ElementType.Parameter}) @Retention (RETINGINTPOLICY.RUNTIME) @Documented @Interface List -@Repeatable (todotypevalid.list.class) เป็นคุณสมบัติหลายเวลาเดียวกันที่ได้รับการสนับสนุนโดย JDK8
ตามข้างต้นมันยังสามารถใช้ในชั้นเรียนการแจงนับ
เมื่อทรัพยากร/todo.propertiestodo.todostatus.insert = เพิ่มไปยังใหม่สถานะจะไม่เริ่มต้นเท่านั้น เมื่อ toDo.todostatus.update = ได้รับการแก้ไขสถานะจะอยู่ในระหว่างดำเนินการหรือเสร็จสมบูรณ์เท่านั้น Bean/*** สถานะสิ่งที่ต้องทำ 0 ไม่เริ่ม 1 ในความคืบหน้า 2 เสร็จสิ้น*/@todostatusValid (enums = {todostatus.not_started}, ข้อความ = "{toDo.todostatus.insert}", กลุ่ม = {c.insert.class, s.insert.class todostatus.completed}, message = "{toDo.todostatus.update}", กลุ่ม = {c.update.class, s.update.class}) ส่วนตัว todostatus todostatus ส่วนตัว;คำอธิบายประกอบที่กำหนดเอง
@documented@constraint (rigidatedby = {toDostatusValid.todostatUsvalidFactory.class})@Target ({ElementType.field, ElementType.annotation_type, ElementType.parameter})@retention TODOSTATASVALID {ข้อความสตริง () ค่าเริ่มต้น "โปรดป้อนสถานะที่ถูกต้อง"; todostatus [] enums () ค่าเริ่มต้น {}; คลาส <?> [] กลุ่ม () ค่าเริ่มต้น {}; ชั้นเรียน <? ขยาย payload> [] payload () ค่าเริ่มต้น {}; คลาส TodostatusValidFactory ใช้ข้อ จำกัด Validator <TodostatusValid, todostatus> {ส่วนตัว todostatus [] enums; @Override โมฆะสาธารณะเริ่มต้น (todostatusValid todostatusValid) {this.enums = todostatusValid.enums (); } @Override บูลีนสาธารณะ isvalid (ค่า todostatus, บริบท constraintValidatorContext) {todostatus [] ค่า = todostatus.values (); if (enums! = null && enums.length! = 0) {value = enums; } if (array.aslist (ค่า) .contains (value)) ส่งคืนจริง; กลับเท็จ; }} @Target ({ElementType.field, ElementType.Annotation_Type, ElementType.Parameter}) @Retention (RETINGINTPOLICY.RUNTIME) @Documented @Interface List {TODOSTATUSVALID [] -สรุป
ข้างต้นคือสิ่งที่ตัวแก้ไขแนะนำให้ใช้กับ Springboot ใช้ JSR 303 เพื่อตรวจสอบเลเยอร์ควบคุมคอนโทรลเลอร์และการตรวจสอบ AOP ชั้นบริการบริการ ใช้ไฟล์ทรัพยากรข้อความเพื่อทำให้ข้อความเป็นสากล ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!