Panduan dan Konfigurasi Paket
Impor Paket JSR 303 dan Paket Hibernate Valid
<dependency> <GroupId> org.hibernate.validator </groupid> <ArTifactId> hibernate-validator </artifactid> <version> 6.0.5.Final </version> </Dependency> <groupid> javax.validation </groupid> <ArtiFacTid> validasi </apix. <Version> 2.0.0.Final </version> </gantage>
Konfigurasi Springboot
sumber daya/application.yml file sumber daya konfigurasi pemrosesan internasional
musim semi:
Pesan:
Basename: base, todo # sumber daya basis.properties and todo.properties, dipisahkan oleh koma
Pengkodean: UTF-8 # Parsing Encode harus ditentukan, jika tidak kode kacau Cina
Konfigurasikan di kelas startup springboot
@SpringbootApplicationPublic Class Application Memperluas WebMvCconfigurerAdapter {@Value ("$ {spring.messages.baseName}") Private String Basename; public static void main (string [] args) {springApplication.run (application.class, args); } @Bean @primary Pesan Publik Sumber PesanSource () {ResourceBundLeMessageSource ResourceBundLeMessageSource = new ResourceBundLeMessAseSource (); ResourceBundLeMessageSource.SetUsecodeEasDefaultMessage (false); ResourceBundLeMessageSource.SetDefaultEncoding ("UTF-8"); // Ulangi definisi sumber daya BEBURDEMESSAGESSOURCE.SetBasEnames (Basename.split (",")); return ResourceBundLeMessageSource; } @Bean @primary public localvalidatorfactorybean validator () {localvalidatorfactorybean validatorFactoryBean = new localvalidatorfactorybean (); ValidatorFactoryBean.SetProviderClass (hibernatevalidator.class); ValidatorFactoryBean.SetValidationMessageSource (MessageSource ()); return validatorFactoryBean; } @Override public validator getValidator () {return validator (); } / *** Verifikasi parameter tunggal pada level metode diaktifkan* / @bean MethodValidationPostProcessor MetodeValidationPostProcessor () {return new MethodValidationPostProcessor (); }}Kami memproses pengecualian yang tidak dapat melewati parameter verifikasi dan tidak dapat melewati lemparan, yang melalui penangkapan pengecualian terpadu.
@ControllerAdvice @componentpublic kelas BindValidexceptionHandler {@ResponseStatus (value = httpStatus.ok) @ExceptionHandler (ConseptAintViolationException.class) PUBLIK @RESPONSEBOBY MSG HANKLECCRAINTVIOLIONDEXCEPTION (ConstrainViolationException E) msg handleconstraintviolationException (ConstrainViolationException E) {responsception E) {responsception E) {responsception E) {responsception E) {ConstrainSception E) {ConstrantVionSception E) e.getConstraintviolations (). iterator (). next (). getMessageTemplate (); return msg.Error (MessageTemplate); } @ResponseStatus (value = httpstatus.ok) @ExceptionHandler (bindException.class) public @ResponseBody msg standEbindException (BindException E) {BINDINGRESULT BINDINGRESULT = e.getBindingResult (); String className = bindingResult.getTarget (). GetClass (). GetName (); Fielderror next = bindingResult.getFielderRors (). Iterator (). Next (); String fieldName = next.getField (); String defaultMessage = next.getDefaultMessage (); if (pola.compile ("IllegalArgumentException: No Enum"). Matcher (defaultMessage) .find ()) {pencocokan pencocokan = pola.compile ("untuk nilai '(.*?)'"). Matcher (defaultMessage); if (matcher.find ()) {defaultMessage = "Tipe enum tidak dapat ditemukan [" + matcher.group (1) + "]"; }} return msg.Error (defaultMessage); } @ResponseStatus (value = httpstatus.ok) @ExceptionHandler (validError.class) public @responseBody msg handlevaliderror (valideRror e) {return msg.eRror (e.getMessage ()); }}Sumber Daya/Basis.Propertie
createid = creator ID tidak bisa kurang dari {value}.
MODIFIERID = ID pengubah tidak boleh kurang dari {value}.
Sumber Daya/Todo.Properties
todo.privateid.min = ID pribadi tidak boleh kurang dari {value}.
Gunakan anotasi pada bidang kacang, di mana antarmuka C dan S dalam grup merujuk pada singkatan dari pengontrol dan layanan, yang mencakup antarmuka insert, antarmuka pembaruan, dll., Yang semuanya merupakan konvensi khusus.
/** * Private id is the foreign key representing multiple tables such as project tasks/non-project tasks/risks/problems/review to-do questions*/@Min(value = 1, message = "{todo.privateId.min}", groups = {C.Insert.class, C.Update.class, S.Insert.class, S.Update.class})private long privateId;/** * Creator id */@Min (value = 1, message = "{createD}", grup = {s.insert.class}) private long creatorId; verifikasi lapisan kontrol pengontrol@divalidasi@restcontroller@requestMapping ("TODO") TODOSERVICE PUBLIC; @GetMapping ("getVo") PUBLIK MSG GetVO (@min (value = 1, message = "untuk melakukan id tidak bisa kurang dari 1.") @RequestParam (wajib = false, defaultValue = "0") ID panjang) {return this.todoService.getVo (id); } @Postmapping ("add") public msg add (@validated ({c.insert.class}) TODO TODO) {return this.todoService.add (TODO); }}@Validasi ({c.insert.class}) menyatakan untuk mengaktifkan kelompok verifikasi pada anotasi kacang, dan kelompok verifikasi lainnya tidak akan melakukan verifikasi, yang dapat dibedakan untuk verifikasi terpisah.
Misalnya, jika tidak ada entitas dan hanya satu tipe data dasar, itu dapat diverifikasi, tetapi tiga kondisi perlu dipenuhi:
Verifikasi sendiri.
Layanan Layanan Verifikasi AOP
Kelas Alat Validutil
Perlu dipindai dan terdaftar sebagai satu kasus dengan springboot
@ComponentPublic Class Validutil {@Autowired Private Validator Validator; PUBLIK <T> Atur <ConstraintViolation <T>> Validasi (T objek, kelas <?> ... grup) {return validator.validate (objek, grup); } public <t> Set <scordaintviolation <t>> validateValue (class <t> beantype, string propertyname, nilai objek, kelas <?> ... grup) {return validator.validateValue (beantype, propertieName, value, grup); } / *** Verifikasi parameter dan kembalikan prompt kesalahan pertama* @param t Objek Terverifikasi* @param grup grup diverifikasi* @param <T> Jenis asli sebelum objek Menghapus* @return kesalahan pertama* / publik <T> void validAndRetRirsterrortips (tt, class <?> Groups) {set <cporportVionolonolon; t> tt, class <?> Groups) {set <cporportViolonation = T> Tt, Class <? Groups) {set <ctruktVionolonolonolon; if (validate.size ()> 0) {ConseptViolation <T> next = validate.iterator (). next (); String message = next.getRootBeAnclass (). GetName () + "-" + next.getPropertypath () + "-" + next.getMessage (); lempar validerror baru (pesan); } } /** * Check the parameter and return the first error prompt* @param targetClass The class type of the object that is validated* @param fieldName Name that needs to be validated* @param obj property value required* @param groups group verification group* @param <T> Original type before object erasing* @return First error prompt*/ public <T> void validAndReturnFirstErrorTips(Class targetClass, String fieldName, Object OBJ, kelas <?> ... grup) {set <ConstraintViolation <T>> Validate = Validator.ValidateValue (TargetClass, FieldName, OBJ, Groups); if (validate.size ()> 0) {string message = targetclass.getName () + "-" + fieldName + "-" + validate.iterator (). next (). getMessage (); lempar validerror baru (pesan); }}}Konfigurasi AOP
Prinsip utama adalah menggunakan metode intersep AOP untuk menjalankan parameter dan mendapatkan anotasi untuk parameter. Kemudian gunakan kelas alat untuk memverifikasi parameter. Jika verifikasi gagal, kesalahan khusus akan dilemparkan langsung, dan kesalahan khusus telah diproses secara global.
@Aspek @componentpublic kelas validatoraop {@autowired private validutil validutil; /*** Tentukan aturan intersepsi: mencegat semua kelas di bawah paket layanan com.service, ada metode dengan anotasi @Service. */ @Pointcut ("Eksekusi (*com.service ..*(..)) dan @annotation (org.springframework.stereotype.service)") public void controllermethodpointcut () {}/ ***implementasi spesifik dari interceptor*/ @around ("controllermethodpoodcut ()") spesifik dari interceptor*/ @around ("controlermethodpoodcut ()") ") spesifik dari interceptor*/ @around (" controlermethodpoodcut () ")) Anda juga dapat secara langsung menulis "Eksekusi (* com.xjj .........)" ke Interceptor Objek Publik ini (ProsesingJoInpoint PJP) {Methodyignature Methodyignature = (Methodyignature) pjp.getSignature (); Metode metode = MethodIchature.getMethod (); Anotasi [] [] arganNotations = method.getParameterAnnotations (); Objek [] args = pjp.getArgs (); untuk (int i = 0; i <args.length; i ++) {for (annotation annotation: arganNotations [i]) {if (validated.class.isInstance (annotation)) {divalidasi divalidasi = (divalidasi) anotasi; Kelas <?> [] Grup = validated.Value (); validutil.validandreturnfirsterrortips (args [i], grup); }} coba {return pjp.proed (args); } catch (Throwable Throwable) {Throwable.PrintStackTrace (); } return true; }}Verifikasi anotasi @min @notnull Metode penggunaan
Tidak dapat ditulis di kelas implementasi, hanya anotasi yang dapat digunakan di antarmuka
Pada dasarnya cara yang sama seperti pengontrol
@ValidededPublic Interface TodoService { / *** kueri Single To-Do* @param ID Nomor Seri* @Return To-do* / msg getVo (@min (value = 1, message = "To-do ID tidak bisa kurang dari 1.") ID panjang); / *** Tambahkan data* @param TODO objek*/ msg add (@validated ({s.insert.class}) TODO TODO);}Bagikan beberapa anotasi verifikasi khusus
Verifikasi string null
Paket javax.validation.constraints; impor javax.validation.constraint; impor javax.validation.constraintvalidator; impor javax.validation.constraintvalidorcontext; Impor Javax.Validation.payload; Impor Java.Lang.annotation. Itu tidak dapat digunakan dan perlu ditulis ulang. Paket tidak dapat diubah. */@Didokumentasikan@kendala (divalidatedBy = {notblank.notblankValidator.class})@target ({elementType.field, elementType.annotation_type, elementType.parameter})@retention (retensipolicy.runtime) publik @interface notblank {class <? String message () default "{notblank}"; Kelas <? Extends payload> [] payload () default {}; kelas notblankValidator mengimplementasikan ConstraintValidator <notblank, objek> {public notblankValidator () {} @Override public void initialize (NotBlank ConstraintAnnotation) {} @Override public isValid (Nilai objek, ConstrainValidatorContext Context). }}}Ketik penilaian, untuk menentukan apakah tipe adalah salah satu nilai, Anda dapat menyesuaikan penilaian berdasarkan kelompok verifikasi
Sumber Daya/TODO.PROPERTIESTODO.TODOTYPE.INSERT = Ketika baru ditambahkan, jenis yang harus dilakukan hanya dapat menjadi salah satu tugas, tugas proyek, atau masalah non-proyek. todo.todotype.update = Saat memodifikasi, jenis yang harus dilakukan hanya dapat menjadi salah satu risiko dan meninjau masalah yang harus dilakukan. bean/*** todotype0non-Project Task1project Task2problem3Risk4ReviewTodotypeValid (value = {"0", "1", "2"}, pesan = "{TODO.TODOTYPE.InSert}, grup = {c.insert.insert.class, s.slasser.sert.class}, grup = {c.insert.insert.class, s.class, s.insertas = classer = {classer. "4"}, message = "{todo.todotype.update}", grup = {c.update.class, s.update.class}) string pribadi todotype;Anotasi khusus
@Didokumentasikan@kendala (divalidatedBy = {todotypeValid.todotypeValidFactory.class})@target ({elementType.field, elementType.annotation_type, elementType.parameter})@retensi (retentionpolicy.runtime) @repePeatable (toDotyPevaValid.InClistLass) @rePePeatable (toDotypevalid.Inclies.InClistLass) @rePePeatable (toDotyPevalid.InChalDass) @rePePeatable (toDotypevalid. pesan () default "Harap masukkan jenis yang benar"; String [] value () default {}; Kelas <?> [] Grup () default {}; Kelas <? Extends payload> [] payload () default {}; kelas todotypevalidFactory mengimplementasikan ConceptValidator <todotypevalid, string> {private string [] annotationValue; @Override public void menginisialisasi (todotypevalid todostatusValid) {this.annotationValue = todostatusValid.value (); } @Override public boolean isValid (nilai string, conceptValidatorContext konteks) {if (arrays.aslist (annotationValue) .contains (value)) return true; mengembalikan false; }} @Target ({elementType.field, elementType.annotation_type, elementType.parameter}) @retention (retentionPolicy.runtime) @documented @interface list {todotypeValid [] value (); }}@RePeAtable (todotypevalid.list.class) adalah fitur anotasi yang sama yang didukung oleh JDK8.
Menurut hal di atas, ini juga dapat digunakan pada kelas enumerasi.
Saat Sumber Daya/Todo.PropertertiPodo.todostatus.insert = Tambahkan ke yang baru, statusnya hanya dapat tidak dimulai. Ketika Todo.todostatus.update = dimodifikasi, status hanya dapat berlangsung atau diselesaikan. bean/*** status todo 0 tidak dimulai 1 dalam kemajuan 2 selesai*/@todostatusValid (enums = {todostatus.not_started}, pesan = "{todo.todostatus.insert}, grup = {c.insert.class, s.insert.class.class}@toDostatus, toDostatus = {c.insert. Todostatus.completed}, message = "{TODO.Todostatus.update}", grup = {c.update.class, s.update.class}) todostatus todostatus pribadi;Anotasi khusus
@Didokumentasikan@kendala (divalidatedBy = {todostatusValid.todostatusValidFactory.class})@target ({{elementType.field, elementType.annotation_type, elementType.parameter})@retention (retentieDicy.RunTime) @RePeataSable (toDostateACEACECE (TODOMETER (TODOMETER (TODOMETER (TODOMETER (TOBARAMETER (TOBARAMETER (TOBARAMETER (TOBARAMETER (TOBARAMETER (TOBORETIPLICE. TODOSTATUSVALID {string message () default "Harap masukkan status yang benar"; Todostatus [] enums () default {}; Kelas <?> [] Grup () default {}; Kelas <? Extends payload> [] payload () default {}; kelas TodostatusValidFactory mengimplementasikan ConseptValidator <todostatusValid, todostatus> {todostatus private [] enums; @Override public void menginisialisasi (todostatusValid todostatusValid) {this.enums = todostatusValid.enums (); } @Override public boolean isValid (nilai todostatus, concinctValidatorContext konteks) {todostatus [] values = todostatus.values (); if (enums! = null && enums.length! = 0) {values = enums; } if (arrays.aslist (nilai) .contains (value)) return true; mengembalikan false; }} @Target ({elementType.field, elementType.annotation_type, elementType.parameter}) @retention (retentionPolicy.runtime) @documented @interface list {todostatusValid [] value (); }}Meringkaskan
Di atas adalah apa yang diperkenalkan editor ke Springboot menggunakan JSR 303 untuk memverifikasi lapisan kontrol pengontrol dan lapisan layanan verifikasi AOP. Gunakan file sumber daya pesan untuk menginternasionalkan pesan. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!