Recientemente, es necesario enviar datos dinámicos, es decir, debe analizar y enviar información de definición de campo de datos antes de poder aclarar los tipos de campo específicos correspondientes, y luego hacer conversión de tipo de datos y verificación de validez de campo. Luego, después de realizar el procesamiento de negocios, envíe la base de datos y desarrolle un conjunto de lógica de verificación usted mismo, el ciclo es demasiado largo. Por lo tanto, se analizó el principio de implementación de la validación de primavera, y se reutilizó los diversos validador subyacente. Aquí, el proceso de análisis del principio de validación de primavera se registrará sin entrar en detalles.
Cómo usar la validación de primavera
Compruebe si el bean cumple con las especificaciones JSR-303 al inicializar Spring Bean
1.
2. Definir reglas de verificación en la clase de modelo, como @max, @min, @notempty
3. Declarar el bean, el código integral es el siguiente:
@BeanPublic BeanPostPossor BeanValidationPostPosTprocessor () {return new BeanValidationPostPossorsor ();}@beanpublic Usermodel getUsermodel () {usermodel usermodel = new Usermodel (); usermodel.setUsername (nulo); usermodel.setPassword ("123"); return usermodel;} @dataClass usermodel {@notnull (mensaje = "username no puede ser nulo") @Pattern (regExp = "[A-ZA-Z0-9 _] {5,10}", Message = "UserName es ilegal") Nombre de usuario de cadena privada; @Size (min = 5, max = 10, mensaje = "La longitud de la contraseña es ilegal") PRIVADA PASCONTA DE CADA;}4. BeanValidationPostProcessor Hay una propiedad de tipo booleana después de la inicialización, que es falso por defecto. Si es falso, el frijol se verifica en el proceso de forejización postprocesa. De lo contrario, el bean se verifica en el proceso de posprocesa.
5. Esta verificación utiliza la lógica de PostPossor Bean de Spring
6. Verifique que se llame al método de Dovalidato y llame a Validator.Validate. El validador predeterminado es HibernateValidator, el paquete Validation-API es la especificación Java y la especificación de resorte predeterminada se implementa como el paquete Hibernate-Validator. Este marco no tormenta de hibernación hibernado
Dovalidato vacío protegido (objeto frijol) {afirmo.state (this.validator! = null, "sin conjunto de validador"); Establecer <restricticViolation <S Object>> resultado = this.Validator.Validate (bean);7. HibernateValidator llamas a ValidatorFactoryImpl de forma predeterminada para generar validador y luego expandir ValidatorFactoryImpl
Especificaciones JSR-303 de nivel de método de soporte
1. Agregar manualmente MethodValidationPostProcessor Bean
2. Agregue la anotación @Validated a la clase (también se admite la anotación personalizada y se pasa al crear un MethodValidationPostProcessor Bean)
3. Agregue anotaciones de verificación a los parámetros del método, como @max, @min, @notempty, @notnull, etc.
@Componente@validatedpublic clase beanFormethodValidation {public void validate (@notempty name, @min (10) int age) {System.out.println ("Validate, Name:" + Name + ", Age:" + Age); }}4. MethodValidationPostprocessor utiliza AOP para completar la llamada al método
public void AfterPropertIesset () {PointCut PointCut = new `AnnotationMatchingPointCut` (this.ValidateAnnotationType, true); this.AdVisor = new `defaultPointCutAdVisor` (PointCut, CreateMethodValidationAdVice (this.Validator));} Consejo protegido CreateMethodValidationAdVice (@Nullable Validator Validation) {return (validator! = null? New MethodValidationInterceptor` (Validator): New MethodValidation) {return (validator! = Null?5. La capa subyacente también llama a ValidatorFactoryImpl de manera predeterminada para generar validador, y el validador completa la verificación.
Lógica de verificación de llamadas de codificación directa, como
Persona de clase pública {@notnull (mensaje = "género no puede estar vacío") privado género género; @min (10) privado edad entera; ...} ValidatorFactory ValidatorFactory = Validation.BuildDefaultValidatoryFactory (); Validator Validator = ValidatorFactory.getValidator (); Personi = New Person (); Person.SetGender (Gender.Man.Man.ManTaTer (Validatater (ValateTaTer (Validator (Persona (Persona);Igual que el anterior, la llamada predeterminada a ValidatorFactoryImpl se llama para generar validador, y el validador completa la verificación específica.
Utilice una anotación válida o validada para anotar los parámetros que se verificarán en los parámetros del método del controlador Spring
1. Primero, familiarícese con el proceso de solicitud y llamadas de la primavera
2. Puede ver que la verificación de los parámetros se realiza durante el proceso de varios parámetros de solicitud de procesamiento de resolución.
3. La capa subyacente llama al método validar de Databinder de manera uniforme
4. El papel de Databinder: Binder que permite establecer valores de propiedad en un objeto de destino, incluido el soporte para la validación y el análisis de resultados vinculantes, es decir, la aglutinante procesa los parámetros de forma de cadena enviados por solicitud y los convierte en el tipo que el servidor realmente necesita. La carpeta proporciona soporte para la validación y puede almacenar resultados de verificación.
5. El validador de Databinder se inicializa en el configurablewebbindingInitializer de forma predeterminada. OpcionalValidatorFactoryBean se usa de forma predeterminada. Este frijol hereda el local ValidatorFactoryBean. LocalValidatorFactoryBean combina diversas información de verificación, como validatorFactory, propiedades de verificación personalizadas, etc., y utiliza validatorFactoryImpl para obtener el validador de manera predeterminada.
En este punto, todas las pistas apuntan a ValidatorFactoryImpl. El siguiente análisis es el siguiente
Public Validator `getValidator` () {return` createValidator` (restrictValidAtManager.getDefaultConstraintValidatorFactory (), valueExtractOnManager, validatorToryScopedContext, MethodValidationConfiguration);} Validator `CreateValidator '(restrictiva de restrictatorTorTory, restringtatory, restringtoryrory, restringtoryrory, restrictoryrory, restrictoryrory, restringtatory, restrementvaliDatory, WACTORIOR ValueExtractManager valueExtractManager, ValidatorFactoryScopedContext ValidatorFactoryScopedContext, MethodValidationConfiguration MethodValidationConfiguration) {BeanMetadatAmanager BeanMetAdatamanager = BeanMetAdatamanagers.comPuteifabsent (NewArmetAdatAmanagerkey (( validatorFactoryScopedContext.getParameterNameProvider(), valueExtractorManager, methodValidationConfiguration ), key -> new BeanMetaDataManager( `constraintHelper`, executableHelper, typeResolutionHelper, validatorFactoryScopedContext.getParameterNameProvider(), valueExtractorManager, validationOrderGenerator, 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, Mensajes.ValidateObjectMustNotBenull ()); SanityCheckGroups (grupos); ValidationContext <T> ValidationContext = `getValidationContextBuilder (). Forvalidate (Object)`; if (! ValidationContext.getRootBeanMetadata (). HasConstraints ()) {return Collections.emptySet (); } ValidationOrder ValidationOrder = DetermeGroupValidationOrder (grupos); ValueContext <?, Object> valueContext = `valueContext.getLocalExecutionContext` (ValidatorScopedContext.getParameternameProvider (), Object, ValidationContext.GetRootBeAnmetAdata (), PathImpl.CreaterToTpath ()); return ValidateInScontext (ValidationContext, ValueContext, ValidationOrder);}1. GetValidator-> createValidator-> validatorImpl-> validar
During the execution process, beanMetaDataManager, validationContext, valueContext and other contents are encapsulated, which are context information that will be used during verification, such as all verification items of the bean to be checked (including parent class and interface), property, and method parameter verification information, and various tool classes commonly used by validator (such as processing of message, script, etc.) inherited from ValidatorFactoryScopedContext, etc., and El contenido es relativamente complejo.
2. Se ignora la verificación del grupo, y el procesamiento del grupo predeterminado es ValidateConstraintsfORDEFAULTGROUP-> ValidateConstraintsForsingLedEffaultGroupElement-> ValidateTaConstraint (nota: MetAconstraints mantiene todas
3. Continúe llamando al método DovalidateConstraint de Metaconstraint, y siga diferentes restricciones de acuerdo con diferentes tipos de anotación.
public static <U extiende anotación> restrictree <u> de (restrictessDescriptorImpl <u> compositionDescriptor, type ValidedValueType) {if (compositionDescriptor.getCompositingConstraNstImpls (). IsEmpty ()) {return New SimpleConstraintTree <> (componente de composición, ValidatedValuetType); } else {return new CompositionConstrainttree <> (composiciónDescriptor, validatedValueType); }}4. ¿Qué debo ser simple y qué debería estar componiendo? Porque ambos llaman al método 'getinitializedConstraintValidator' de restrictree. Este paso se utiliza para obtener el validador correspondiente a la anotación (como decimalmax, notempy, etc.) e inicializar el validador.
5. ConstraintHelper mantiene todos los validadores construidos y los clasifica de acuerdo con la anotación de verificación (como Decimalmax). La clase de descripción del validador mantiene la plantilla genérica del validador (como BigDecimal) de la siguiente manera:
putConstraints( tmpConstraints, DecimalMax.class, Arrays.asList( DecimalMaxValidatorForBigDecimal.class, DecimalMaxValidatorForBigInteger.class, DecimalMaxValidatorForDouble.class, DecimalMaxValidatorForFloat.class, DecimalMaxValidatorForLong.class, Decimalmaxvalidatorfornumber.class, decimalmaxValidatorforCharSequence.class, decimalmaxValidatorFormonETaryamount.class));
Al obtener el validador de la clase de frijol específica, primero obtenga todos los validadores de acuerdo con la anotación. El método correspondiente es restrictsManager.FindMatchingValidatordescriptor, y luego obtenga el validador único de acuerdo con el tipo de objeto que se está marcando.
6. Luego inicializeValidator en función de la información de contexto y luego llame al método ISVALID del validador para verificar
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.