Vor kurzem müssen dynamische Daten übermittelt werden, dh Sie müssen Informationen zur Datenfelddefinition analysieren und übermitteln, bevor Sie die entsprechenden spezifischen Feldtypen klären und dann Datentyp -Konvertierung und Feldvaliditätsprüfung durchführen können. Nach der Geschäftsabarbeitung senden Sie dann die Datenbank und entwickeln Sie eine Reihe von Überprüfungslogik selbst, der Zyklus ist zu lang. Daher wurde das Implementierungsprinzip der Frühlingsvalidierung analysiert und der verschiedene zugrunde liegende Validator wiederverwendet. Hier wird der Prozess der Analyse des Prinzips des Frühlingsvalidierung ohne Einzelheiten aufgezeichnet.
So verwenden Sie Frühlingsvalidierung
Überprüfen Sie, ob die Bean den Spezifikationen der JSR-303 bei der Initialisierung der Federbohnen entspricht
1. Manuell addieren Sie BeanvalidationPostProcessor Bean
2. Definieren Sie die Bestätigungsregeln in der Modellklasse wie @max, @min, @notEmpty
3. Deklarieren Sie die Bean, der umfassende Code lautet wie folgt:
@BeanPublic BeanPostProcessor BeanvalidationPostProcessor () {Neue BeanvalidationPostPostProcessor zurückgeben; UsModel.Setusername (NULL); UsModel.SetPassword ("123"); return userModel;} @DataClass UserModel {@notnull (Message = "Benutzername kann nicht null sein") @Pattern (regexp = "[a-za-z0-9 _] {5,10}", Message = "Benutzername ist illegal") privater String-Benutzername; @Size (min = 5, max = 10, Message = "Passwort ist illegal") Private String Passwort;}V. Wenn es falsch ist, wird die Bohne im Post -ProcessBeforeinitialisierungsprozess verifiziert. Andernfalls wird die Bohne im Postprozessafteritialisierungsprozess verifiziert.
5. Diese Überprüfung verwendet Spring's BeanPostProcessor Logic
6. Überprüfen Sie, ob die Dovalidate -Methode aufgerufen wird, und rufen Sie weiter auf Validator an. Der Standard-Validator ist HibernateValidator, das Validierungs-API-Paket ist die Java-Spezifikation und die Standard-Federspezifikation wird als Hibernate-Validator-Paket implementiert. Dieser Hibernate-Nicht-Form-Rahmen Winterschlafschlag
geschützter void dovalidat (Objektbean) {assert.state (this.validator! = null, "kein Validator -Satz"); Set <ConstraintViolation <Objekt >> result = this.validator.validate (bean);7. HibernateValidator Call ValidatorFactoryImpl standardmäßig zum Generieren von Validator und dann ValidatorFactoryImpl erweitern
Unterstützen Sie JSR-303-Spezifikationen auf Methodenebene
1. Manuell addieren Sie MethodValidationPostProcessor Bean
2. Fügen Sie @Validated Annotation in die Klasse hinzu (benutzerdefinierte Annotation wird ebenfalls unterstützt und wird bei der Erstellung einer MethodValidationPostProcessor -Bean übergeben).
3.. Hinzufügen von Bestätigungsanmerkungen zu den Parametern der Methode wie @max, @min, @notEmpty, @notnull usw.
@Component@validatedPublic Class Beanformethodvalidation {public void validate (@notEmpty String Name, @Min (10) int Alter) {system.out.println ("validate, name:" + name + ", Alter:" + älter); }}V.
public void AfterPertieStieSt () {pointcut pointcut = new `AnnotationMatchingPointCut` (this.ValidatedAnnotationType, true); this.advisor = new `defaultPointCutAdvisor`5. Die zugrunde liegende Ebene ruft standardmäßig ValidatorFactoryImpl auf, um den Validator zu generieren, und der Validator vervollständigt die Überprüfung.
Direkter Codierungsanrufüberprüfungslogik wie z.
public class Person {@notnull (Message = "Geschlecht kann nicht leer sein") Privates Geschlecht Geschlecht; @Min (10) Private Ganzzahl Alter; ...} ValidatorFactory validatorFactory = validierung Person (); Person.SetGene (Gender.Man); Validator.Validate (Person);Wie oben ist der Standardaufruf zum ValidatorFactoryImpl aufgerufen, um den Validator zu generieren, und der Validator vervollständigt die spezifische Überprüfung.
Verwenden Sie gültige oder validierte Annotation, um die Parameter der Parameter in den Parametern der Federcontroller zu kommentieren
1. Machen Sie sich zunächst mit der Anfrage und dem Anrufprozess des Frühlings vertraut gemacht
2. Sie können sehen, dass die Parameterüberprüfung während des Prozesses verschiedener Resolver -Verarbeitungsparameter durchgeführt wird.
3. Die zugrunde liegende Schicht ruft die Validierungsmethode des Datenbankminders einheitlich auf
4. Die Rolle von Databinder: Binder, mit der Eigenschaftenwerte auf ein Zielobjekt eingestellt werden können, einschließlich der Unterstützung für die Validierung und Bindungsergebnisanalyse, dh Binder verarbeitet die von der Anforderung übermittelten String-Form-Parameter und konvertiert sie in den Typ, den der Server wirklich benötigt. Der Bindemittel unterstützt die Validierung und kann Überprüfungsergebnisse speichern.
5. Der Validator von Databinder wird standardmäßig im ConfigurableWebbindingInitializer initialisiert. OptionalValidatorFactoryBean wird standardmäßig verwendet. Diese Bohne erbt die LocalValidatorFactoryBean. LocalValidatorFactoryBean kombiniert verschiedene Überprüfungsinformationen wie ValidatorFactory, benutzerdefinierte Überprüfungseigenschaften usw. und verwendet ValidatorFactoryImpl, um den Validator standardmäßig zu erhalten.
Zu diesem Zeitpunkt weisen alle Hinweise auf ValidatorFactoryImpl hin. Die folgende Analyse ist die folgende
Public Validator `getvalidator` () {return` createvalidator` (ConstraintValidatorManager ValueExtractorManager ValueExtractorManager, ValidatorFactoryScopedContext ValidatorFactoryScopedContext, MethodValidationConfiguration MethodValidationConfiguration) {Beanmetadatamanager Beanmetadatamanager = BeanMetadatamanagers.comPuteeifabsent (New BeanMetAtAmanager (New Beanmetadatamanagerkey validatorFactoryScopedContext.getParameternAmeReprovider (), ValueExtractorManager, MethodValidationConfiguration), Key -> Neue Beanmetadatamanager (`Constrainthelper`, exekutiertesHelper, TyperesolutionHelper, ValidatorFactoryScopedContext.Getarleding. BuildDataproviders (), methodValidationConfiguration)); return `new ValidatorImpl`( constraintValidatorFactory, beanMetaDataManager, valueExtractorManager, constraintValidatorManager, validationOrderGenerator, validatorFactoryScopedContext );}public final <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups) { Contracts.assertNotNull( object, Nachrichten.ValidatedObjectMustnotBenull ()); SanityCheckGroups (Gruppen); ValidationContext <T> validationContext = `getValidationContextBuilder (). ForValidat (Objekt)`; if (! validationContext.getRootbeanMetAdata (). } ValidationOrder ValidationOrder = bestimmenGroupValidationSorder (Gruppen); ValuEcontext <? Return valateContext (ValidationContext, ValuEcontext, ValidationRorder);}1. GetValidator-> CreateValidator-> ValidatorImpl-> Validat
Während des Ausführungsprozesses werden Beanmetadatamanager, ValidationContext, ValuEcontext und andere Inhalte eingekapselt. Die Kontextinformationen werden während der Überprüfung verwendet, wie z. ValidatorFactoryScopedContext usw. und der Inhalt ist relativ komplex.
2. Die Gruppenüberprüfung wird ignoriert, und die Standardgruppenverarbeitung ist validiertesConstraintsfordeFaultGroup-> validateConstraintsForsingledeFaultGroupelement-> validatemetaconstraint (Anmerkung: Metaconstraints behält alle Überprüfungen des Bean-Typs und seiner übergeordneten Klasse und der Schnittstelle bei, und es ist notwendig, Validatematemate zu bezeichnen und validatemetonte zu bezeichnen).
3. Nennen Sie weiterhin die DovalidateConstraint -Methode der Metakonstrainierung und befolgen Sie die unterschiedliche Konstanttree gemäß verschiedenen Annotationstypen.
public static <u erweitert Annotation> ConstraintTree <u> von (ConstraintDescriptorImpl <u> compoStrecriptor, Typ ValidatedValUetype) {if (compoSingDescriptor.getComposibitingConstraintImpls (). } else {return New ComposionConstraintTree <> (ComposionDescriptor, validatedValUeType); }}4. Was soll ich einfach gehen und was sollte komponieren? Weil beide die Methode "GetInitializedConstraintValidator" von ConstraintTree nennen. Dieser Schritt wird verwendet, um den Validator zu erhalten, der der Annotation entspricht (z. B. Dezimalmax, Notimpty usw.) und den Validator initialisieren.
5. ConstraintHelper -Klasse unterhält alle gebauten Validatoren und klassifiziert sie gemäß der Überprüfungsannotation (z. B. Dezimalmax). Die Beschreibung des Validators behält die generische Vorlage des Validators (z. B. BigDecimal) wie folgt bei:
Putconstraints (tmpconstraints, decimalmax.class, arrays.aslist (decimalmaxvalidatorforbigdecimal.class, DecimalmaxvalidatorforbiginTeger.class, DecimalmaxvalidatorfordoUble.classclasg.Class. DecimalMaxvalidatorFornumber.Class, DecimalMaxvalidatorForcharsequence.class, DecimalMaxvalidatorFormonetaryAmount.class));
Wenn Sie den Validator der spezifischen Bohnenklasse erhalten, erhalten Sie zunächst alle Validatoren gemäß Annotation. Die entsprechende Methode ist ConstraintManager.
6. InitializeValidator basierend auf den Kontextinformationen initial und dann die Isvalid -Methode des Validators zur Überprüfung rufen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.