В последнее время необходимо представить динамические данные, то есть вам необходимо проанализировать и представить информацию о определении поля данных, прежде чем вы сможете прояснить соответствующие конкретные типы поля, а затем сделать преобразование типа данных и проверку достоверности поля. Затем, после выполнения бизнес -обработки, отправьте базу данных и разработайте набор логики проверки самостоятельно, цикл слишком длинный. Поэтому был проанализирован принцип реализации весенней проверки, и различные базовые валидаторы были повторно использованы. Здесь процесс анализа принципа проверки пружины будет записан без подробностей.
Как использовать весеннюю проверку
Проверьте, соответствует ли фасоль со спецификациями JSR-303 при инициализации Spring Bean
1. Вручную добавить BeanvalidationPostProcessor Bean
2. Определите правила проверки в классе модели, такие как @max, @min, @notempty
3. объявить боб, комплексный код заключается в следующем:
@Beanpublic beanpostprocessor beanvalidationpostprocessor () {return new beanvalidationpostprocessor ();}@beanpublic usermodel getusermodel () {usermodel usermodel = new usermodel (); usermodel.setusername (null); usermodel.setpassword ("123"); return usermodel;} @dataClass usermodel {@notnull (message = "Имя пользователя не может быть нулевым") @pattern (regexp = "[a-za-z0-9 _] {5,10}", сообщение = "Имя пользователя незаконно") частная строка username; @Size (min = 5, max = 10, message = "Длина пароля незаконна")4. BeanvalidationPostProcessor Существует логическое свойство типа после инжинилизации, которое по умолчанию является ложным. Если он ложный, бобы проверяются в процессе постпроцесс -рефинитизации. В противном случае фасоль проверяется в процессе постопроцессафтеринициализации.
5. Эта проверка использует логику Beanpostprocessor Spring
6. Убедитесь, что метод Dovalidate вызывается, и дальнейший вызов Validator.validate. Валидатором по умолчанию является hibernatevalidator, пакет Validation-API-спецификация Java, а спецификация пружины по умолчанию реализована как пакет Hibernate-Validator. Этот спящий спящий спящий спящий спящий
Protected void Dovalidate (Object Bean) {assert.state (this.validator! = null, "нет валидаторного набора"); SET <ConstraintViolation <Object >> result = this.validator.validate (bean);7. HibernateValidator вызывает ValidatorFactoryImpl по умолчанию, чтобы генерировать валидатор, а затем развернуть validatorFactoryImpl
Технические характеристики на уровне метода поддержки JSR-303
1. Вручную добавить метод.
2. Добавить @Validated Annotation в класс (также поддерживается пользовательская аннотация, и она передается при создании метода VostridationPostProcessor Bean)
3. Добавьте аннотации проверки в параметры метода, такие как @max, @min, @notempty, @notnull и т. Д.
@Component@validatedpublic class beanformethodvalidation {public void validate (@notempty String name, @min (10) int age) {system.out.println ("validate, name:" + name + ", age:" + age); }}4. MethodValidationPostProcessor использует AOP для завершения вызова метода
public void efpropertiesset () {pointcut pointcut = new `annotationmatchingpointcut` (this.validatannotationtype, true); this.advisor = new `defaultpointcutadvisor` (pointcut, createmethodvalidationAdvice (this.validator));} Защищенные советы createmethodvalidationAdvice (@nullable valdator validator) {return (validator! = null? New` methodValidatoring indator's (validator): newnator intreator).5. Базовый уровень также вызывает ValidatorFactoryImpl по умолчанию, чтобы генерировать валидатор, а валидатор завершает проверку.
Логика проверки прямого кодирования, такая как
Public Class Person {@notnull (Message = "Пол не может быть пустым") Частный гендерный пол; @min (10) частное целочисленное возраст; ...} validatorfactory valyatorfactory = validation.BuildDefaultValidatorFactory (); videalator validator = validatorfactory.getvalidator (); человек. Человек = новое лицо ().То же самое, что и выше, вызов по умолчанию к ValidatorFactoryImpl вызывается для генерации валидатора, и валидатор завершает конкретную проверку.
Используйте допустимые или проверенные аннотации, чтобы аннотировать параметры, которые будут проверены в параметрах метода контроллера пружины
1. Во -первых, ознакомьтесь с процессом запроса и вызова пружины
2. Вы можете видеть, что проверка параметров проводится в процессе различных параметров запроса обработки резолюров.
3. базовый уровень вызывает метод проверки DataBinder равномерно
4. Роль DataBinder: Binder, которая позволяет устанавливать значения свойств на целевой объект, включая поддержку для проверки и анализа результатов привязки, то есть связывание обрабатывает параметры строки, представленные запросом, и преобразует их в тип, который действительно нуждается в сервере. Связь обеспечивает поддержку для проверки и может хранить результаты проверки.
5. Validator DataBinder инициализируется в настраиваемом webBindingInitializeлизаторе по умолчанию. OptionAlValidatorFactoryBean используется по умолчанию. Этот бон наследует локальный ValidatorFactoryBean. LocalValidatorFactoryBean объединяет различную информацию о проверке, такую как ValidatorFactory, пользовательские свойства проверки и т. Д., И использует ValidatorFactoryRyimpl для получения валидатора по умолчанию.
На этом этапе все подсказки указывают на valyatorfactoryimpl. Следующий анализ является следующим
public Validator `getValidator`() { return `createValidator`(constraintValidatorManager.getDefaultConstraintValidatorFactory(), valueExtractorManager, validatorFactoryScopedContext, methodValidationConfiguration );}Validator `createValidator`(ConstraintValidatorFactory constraintValidatorFactory, ValueExtractorManager valueExtractorManager, ValidatorFactoryScopedContext validatorFactoryScopedContext, MethodValidationConfiguration methodValidationConfiguration) { BeanMetaDataManager beanMetaDataManager = beanMetaDataManagers.computeIfAbsent( new BeanMetaDataManagerKey( validatorFactoryScopedContext.getParameterNameProvider(), valueExtractormanager, MethodValidationConfiguration), Key -> new BeanmetAdatamanager (`stuctrainTheLper`, rececualeHelper, typeresolutionHelper, valistatorFactoryScopedContext.getParameterNamepRovider (), valueExtractormanager, validationOrderGenerator, uldAtApRovIderers (), methodEractorManager, ValidationOrderErator, CustraMApRovIderers (),) Возврат `new Validatorimpl` (constraintValidatorFactory, Beanmetadatamanager, ValueExtractormanager, ConstraintValidatorManager, ValidationorderGenator, ValidatorFactoryScopedCopedCopeNcom Сообщения. ValidatedObjectmustnotbenull ()); SanityCheckGroups (группы); ValidationContext <T> validationContext = `getValidationContextBuilder (). Forvalidate (Object)`; if (! valyationContext.getRootbeanMetAdata (). Hasconstraints ()) {return collections.emptyset (); } ValidationOrder ValidationOrder = DegineGroupValidationOrder (группы); ValueContext <?, Object> valueContext = `valueContext.getLocalexeCutionContext` (valistatorsCopedContext.getParameterNameProvider (), Object, valistingContext.getRootbeanMetAdata (), pathiMpl.createrOutpath ()); return validateincontext (ValidationContext, ValueContext, ValidationOrder);}1. getValidator-> createvalidator-> varidatorimpl-> validate
В процессе выполнения инкапсулируют Beanmetadatamanager, ValidationContext, ValueContext и другое содержимое, которые являются контекстной информацией, которая будет использоваться во время проверки, например, все элементы проверки компонента (включая родительский класс и интерфейс), свойство и информацию о проверке параметров метода и различные классы инструментов, обычно используемые Valdator (такая как обработка сообщения, ScriptStore, и т. Д.). и содержание относительно сложное.
2. Проверка группы игнорируется, и обработка группы по умолчанию является ValidateConstraintSfordefultgroup-> validateConstraintsForsingLedeFaultGroupelement-> validatemetaConstraint (Примечание: метакоинструменты сохраняют все проверки типа бобов и его родительского класса и интерфейса, и это необходимо для Traverse и вызовов ValidaTemetaConsterastraintraintraintraintraintraintraints).
3. Продолжайте называть метод DovalidateConstraint of Metaconstraint и следуйте различным Constraintree в соответствии с различными типами аннотаций.
Public Static <U Extends Annotation> ConstraintTree <u> of (constraintDescriptorImpl <u> ComploseDescriptor, Type valyatedValuetype) {if (compassionDescriptor.getCompositingConstraintImpls (). ISempty () {return neweconstraintreeTree <> (composingDescriptor, isempty ()) {return neweconstraintreetree <> (composingDescriptor } else {return new ComposingConstraintTree <> (composingDescriptor, valytedValueType); }}4. Что я должен проста, а что должно быть сочинять? Потому что оба они называют методом «GetInitializedConstraintValidator». Этот шаг используется для получения валидатора, соответствующего аннотации (например, Decimalmax, Notempty и т. Д.) и инициализации валидатора.
5. Класс ConstraintHelper поддерживает все встроенные валидаторы и классифицирует их в соответствии с аннотацией проверки (например, Decimalmax). Класс описания валидатора поддерживает общий шаблон валидатора (например, BigDecimal) следующим образом:
putConstraints( tmpConstraints, DecimalMax.class, Arrays.asList( DecimalMaxValidatorForBigDecimal.class, DecimalMaxValidatorForBigInteger.class, DecimalMaxValidatorForDouble.class, DecimalMaxValidatorForFloat.class, DecimalMaxValidatorForLong.class, Decimalmaxvalidatorfornumber.class, decimalmaxvalidatorforChareSecence.class, DecimalMaxValidatorformonetaryAmount.class));
При получении валидатора конкретного класса бобов сначала получите все валидаторы в соответствии с аннотацией. Соответствующим методом является constraintmanager.findmatchingvalidatordescriptor, а затем получить уникальный валидатор в соответствии с типом проверенного объекта.
6. Затем инициализируйте Validator на основе контекстной информации, а затем вызовите метод isValid валидатора, чтобы проверить
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.