Pakethandbuch und Konfiguration
Importieren Sie JSR 303 -Pakete und Winterschlafpakete
<Depopenty> <gruppe> org.hibernate.validator </GroupId> <artifactId> Hibernate-Validator </artifactid> <version> 6.0.5.finale </Version> </abhängig> <depelzie <version> 2.0.0.Final </Version> </abhängig>
Springboot -Konfiguration
Ressourcen/application.yml Nachrichtenressourcendatei internationale Verarbeitungskonfiguration
Frühling:
Nachrichten:
Grundname: Basis, Todo # Ressourcendateien Base.properties und Todo.Properties, getrennt durch Kommas
Codierung: UTF-8 # Parsing-Codierung muss angegeben werden, ansonsten chinesischer verstümmelter Code
Konfigurieren Sie in Springboot Startup -Klasse
@SpringBootApplicationPublic Class -Anwendung erweitert webmvcconFigurerAdapter {@Value ("$ {Spring.Messages.Basename}") Private String Basename; public static void main (String [] args) {SpringApplication.run (application.class, args); } @Bean @Primary public messource messageSource () {ResourcebundLemessageSource ResourcebundLemessageSource = new ResourcebundLemessageSource (); ResourceBundLemessageSource.SetUseCodeDeFaultMessage (false); ResourceBundLemessageSource.SetDefaultCoding ("UTF-8"); // Definition Recess ResourceBundLemessageSource.SetBasenamen (BasisName.split (",")); resourcebundLemessagesource zurückgeben; } @Bean @Primary publicCalValidatorFactoryBean validator () {localValidatorFactoryBean validatorFactoryBean = new LocalValidatorFactoryBean (); validatorFactoryBean.setProviderClass (HibernateValidator.Class); validatorFactoryBean.setValidationMessageSource (MessageSource ()); return validatorFactoryBean; } @Override Public Validator getValidator () {return validator (); } / *** Eine einzelne Parameterüberprüfung auf Methodenebene ist aktiviert* / @bean public methodValidationPostProcessor methodValidationPostProcessor () {Neue MethodValidationPostProcessor () zurückgeben; }}Wir verarbeiten Ausnahmen, die die Überprüfungsparameter nicht übergeben und die geworfenen nicht übergeben können, was durch einheitliche Ausnahmeerfassung erfolgt.
@ControllerAdvice @componentpublic class bindvalidexceptionHandler {@responsestatus (value = httpstatus.ok) @ExceptionHandler (ConstraintViolationException.class) public @RespondeBody msg HandleConstraintviolationException (ConstraintViolationException E) {String Messagetemplate = E.GetConstraintViolations (). Iterator (). Next (). getMessAgetemplate (); return msg.Error (MessAgetemplate); } @Responsestatus (value = httpStatus.ok) @ExceptionHandler (BindException.class) public @Responbody msg talBIndexception (BindException e) {BindingResult BindingResult = E.GetBindingingResult (); String className = bindingResult.gettarget (). GetClass (). GetName (); Fielderror Next = BindingResult.GetFielderRors (). Iterator (). Next (); String fieldname = next.getField (); String defaultMessage = next.getDefaultMessage (); if (muster.comPile ("illegalArgumentException: no enum"). Matcher (defaultMessage) .find ()) {Matcher Matcher = muster.comPile ("for Value '(.*?)'"). Matcher (DefaultMessage); if (matcher.find ()) {defaultMessage = "Der Enum -Typ kann nicht gefunden werden [" + 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 ()); }}Ressourcen/Base.Propertie
CreatorID = Creator ID kann nicht weniger als {Wert} sein.
ModifierID = Modifier -ID kann nicht weniger als {Wert} sein.
Ressourcen/todo.properties
todo.privateid.min = private id kann nicht weniger als {Wert} sein.
Verwenden Sie Annotationen auf dem Feld Bean, wobei sich die C- und S -Schnittstellen in der Gruppe auf die Abkürzung des Controllers und des Dienstes beziehen, die die Schnittstelle zur Einfügen, die Aktualisierung der Schnittstelle usw. enthalten, die alle benutzerdefinierten Konventionen sind.
/*** Private ID ist der fremde Schlüssel, der mehrere Tabellen darstellt, z. */@Min (value = 1, message = "{creatorId}", gruppen = {S.Insert.class}) private long CreatorId; Controller Control Layer -Überprüfung@validated@rastController@requestmapping ("toDo") öffentliche Klasse toDocontroller {@Autowired private toDoervice toDoService; @GetMapping ("getVo") public msg getvo (@min (value = 1, message = ", um ID zu do dage nicht kleiner als 1.") @RequestParam (erforderlich = false, defaultValue = "0") Long ID) {rent this.todoService.getVo (ID); } @Postmapping ("add") public msg add (@validated ({c.insert.class}) Todo Todo) {return this.todoService.add (todo); }}@Validated ({C.insert.class}) deklariert, dass Bestätigungsgruppen für Bean -Annotation aktiviert werden können, und andere Überprüfungsgruppen werden keine Überprüfung durchführen, die für die separate Überprüfung unterschieden werden können.
Wenn es beispielsweise keine Entität und nur einen grundlegenden Datentyp gibt, kann er verifiziert werden, aber drei Bedingungen müssen erfüllt werden:
Überprüfen Sie selbst.
Service -Service -Schicht AOP -Überprüfung
ValidUtil Tool Class
Müssen durch Springboot gescannt und als einzelner Fall registriert werden
@ComponentPublic Class ValidUtil {@autowired Private Validator Validator; public <T> set <ConstraintViolation <t >> validat (t -Objekt, Klasse <?> ... Gruppen) {return validator.validate (Objekt, Gruppen); } public <T> set <ConstraintViolation <T >> validateValue (Klasse <T> BeanType, String PropertyName, Objektwert, Klasse <?> ... Gruppen) {return validator.ValidateValue (BeanType, PropertyName, Value, Gruppen); } / *** Überprüfen Sie den Parameter und geben Sie die erste Fehlereingabeaufforderung zurück. if (validate.size ()> 0) {ConstraintViolation <T> next = validate.iterator (). next (); String message = next.getRootbeanClass (). GetName () + "-" + next.getPropertyPath () + "-" + next.getMessage (); neue validError (meldung) werfen; }} / *** Überprüfen Sie den Parameter und geben Sie die erste Fehlereingabeaufforderung zurück. OBJ, Klasse <?> ... Gruppen) {set <ConstraintViolation <t >> validate = validator.ValidateValue (Zielklasse, Feldname, OBJ, Gruppen); if (validate.size ()> 0) {String message = targetClass.getName () + "-" + fieldname + "-" + validate.iterator (). Next (). getMessage (); neue validError (meldung) werfen; }}}AOP -Konfiguration
Das Hauptprinzip besteht darin, die AOP -Intercept -Methode zu verwenden, um Parameter auszuführen und Annotationen für Parameter zu erhalten. Verwenden Sie dann die Werkzeugklasse, um die Parameter zu überprüfen. Wenn die Überprüfung fehlschlägt, wird ein benutzerdefinierter Fehler direkt geworfen und der benutzerdefinierte Fehler wurde global verarbeitet.
@Aspekt @componentpublic class validatoraop {@autowired private validUtil validUtil; /*** Abfangenenregeln definieren: Abfangen alle Klassen unter dem Com.Service -Paket, es gibt Methoden mit @Service Annotation. */ @Pointcut ("Execution (*com.service ..*(..)) und @Annotation (org.springFramework.stereotype.Service)") public void ControllerMethodoTCOtCUT () {}/ ***Spezifische Implementierung von Interceptor*/ @Around ("ControllerMethodoDpointcut ()"). Sie können auch direkt "Execution (* com.xjj .........) in diesen öffentlichen Objekt -Interceptor (ProceedingJoInpoint PJP) {MethodInt methodicignature = (methodeInt) pjp.getSignature () schreiben; Methodenmethode = methodesignature.getMethod (); Annotation [] [] arganNotations = methode.getParameterAnnotations (); Object [] args = pjp.getargs (); für (int i = 0; i <args.Length; i ++) {für (Annotation Annotation: Argannotations [i]) {if (validated.class.issinstance (Annotation)) {validated validated = (validated) Annotation; Klasse <?> [] Gruppen = validiert.Value (); validutil.validandReturnfirsterrortips (Args [i], Gruppen); }} try {return pjp.procece (args); } catch (throwable throwable) {throwable.printstacktrace (); } Return true; }}Überprüfen Sie die Annotation @min @notnull Nutzungsmethode
Kann nicht in der Implementierungsklasse geschrieben werden, nur Anmerkungen können in der Schnittstelle verwendet werden
Im Grunde genauso wie Controller
@ValidatedPublic Interface TodoService { / *** Query Single To-Do* @param ID Seriennummer* @return Single TO-DO* / msg getVo (@Min (value = 1, Message = "TO-Do-ID kann nicht weniger als 1.") Long ID); / *** Daten hinzufügen* @param toDo -Objekt*/ msg add (@validated ({S.Insert.class}) Todo Todo);};};Teilen Sie einige benutzerdefinierte Überprüfungsanmerkungen mit
String Null -Überprüfung
Paket Javax.Validation.Constraints; Import Javax.Validation.Constraint; Import Javax.Validation.ConstraintValidator; Import Javax.Validation.ConstraintvalidatorContext; Es kann nicht verwendet werden und muss umgeschrieben werden. Paket kann nicht geändert werden. */@Documented@Constraint( validatedBy = {NotBlank.NotBlankValidator.class})@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)public @interface NotBlank { Class<?>[] groups() default {}; String message () default "{notblank}"; Klasse <? erweitert Payload> [] payload () Standard {}; Class NotBlankvalidator implementiert ConstraintValidator <Crtblanks, Object> {public notblankvalidator () {} @Override public void initialize (Notblank ConstaintAnnotation) {} @Override public boolean isvalid (Object, ConstraintValidatorcontext context). }}}Tippen Sie das Urteilsvermögen, um festzustellen, ob Typ einer der Werte ist, können Sie das Urteil anhand der Verifizierungsgruppe anpassen
Ressourcen/todo.propertiestodo.todotype.insert = Wenn neu hinzugefügt wird, kann der To-Do-Typ nur eine von nichtprojektierenden Aufgaben, Projektaufgaben oder Problemen sein. todo.todotype.update = Beim Ändern kann der TO-Typ nur eines der Risiken sein und die Aufgabenprobleme überprüfen. bean/** * TodoType0Non-project Task1Project Task2Problem3Risk4ReviewTodoTypeValid(value = {"0", "1", "2"}, message = "{todo.todoType.insert}", groups = {C.Insert.class, S.Insert.class})@TodoTypeValid(value = {"3", "4"}, message = "{todo.todotype.update}", gruppen = {C.Update.class, S.Update.class}) private String todotype;Benutzerdefinierte Anmerkungen
@Documented@Constraint(validatedBy = {TodoTypeValid.TodoTypeValidFactory.class})@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Repeatable(TodoTypeValid.List.class)public @interface TodoTypeValid {String message () Standard "Bitte geben Sie den richtigen Typ ein"; String [] value () Standard {}; Klasse <?> [] Gruppen () Standard {}; Klasse <? erweitert Payload> [] payload () Standard {}; Klasse todotypevalidFactory implementiert ConstraintValidator <todotypevalid, String> {private String [] AnnotationValue; @Override public void initialize (toDotypevalid todostatusvalid) {this.AnnotationValue = todostatusValid.Value (); } @Override public boolean isValid (String -Wert, ConstraintValidatorContext -Kontext) {if (arrays.aslist (AnnotationValue) .Contains (value)) return true; false zurückgeben; }} @Target ({elementtype.field, elementtype.annotation_type, elementtype.parameter}) @retention (retentionPolicy.runtime) @Documented @Interface List {toDotypevalid [] value (); }}@Repeatable (todotypevalid.list.class) ist dieselbe Annotation Multiple-Time-Funktion, die von JDK8 unterstützt wird.
Gemäß den oben genannten kann es auch für Aufzählungsklassen verwendet werden.
Wenn Ressourcen/todo.propertiestodo.todostatus.insert = zu neu hinzufügen, kann der Status nur nicht gestartet werden. Wann todo.todostatus.update = geändert wird, kann der Status nur in Arbeit sein oder abgeschlossen sein. Bean/*** Todo Status 0 nicht gestartet 1 in Bearbeitung 2 abgeschlossen*/@todostatusvalid (Enums = {todostatus.not_started}, Message = "{todo.todostatus.insert}", Gruppen = {C.Insert.class, S.Classe})@toDostatusvalid (Enausläufe, {todostatuStusin)@todostatusvalid (Enausläufe, {todostatuStusing@-Pl. Todostatus.com pleted}, message = "{Todo.todostatus.update}", gruppen = {C.Update.class, S.Update.class}) private todostatus Todostatus;Benutzerdefinierte Anmerkungen
@Documented@Constraint(validatedBy = {TodoStatusValid.TodoStatusValidFactory.class})@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Repeatable(TodoStatusValid.List.class)public @interface TodostatusValid {String message () Standard "Bitte geben Sie den richtigen Status ein"; Todostatus [] Enums () Standard {}; Klasse <?> [] Gruppen () Standard {}; Klasse <? erweitert Payload> [] payload () Standard {}; Klasse todostatusvalidfactory implementiert ConstraintValidator <todostatusvalid, todostatus> {private todostatus [] Enums; @Override public void initialize (todostatusvalid todostatusvalid) {this.enums = todostatusvalid.enums (); } @Override public boolean isvalid (todostatus value, ConstraintValidatorContext -Kontext) {todostatus [] values = todostatus.Values (); if (enum! = null && enums.length! = 0) {values = enum; } if (arrays.aslist (Werte) .Contains (Wert)) return true; false zurückgeben; }} @Target ({elementtype.field, elementtype.annotation_type, elementtype.parameter}) @Retention (retentionPolicy.runtime) @Documented @Interface List {todostatusvalid [] value (); }}Zusammenfassen
Das obige ist das, was der mit Springboot eingeführte Editor mit JSR 303 verwendet hat, um die Controller -Steuerungsschicht und die AOP -Überprüfung der Service -Service -Schicht zu überprüfen. Verwenden Sie Nachrichtenressourcendateien, um Nachrichten zu internationalisieren. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!