최근에 동적 데이터를 제출해야합니다. 즉, 해당 특정 필드 유형을 명확히하기 전에 데이터 유형 변환 및 필드 유효성 검증을 수행하기 전에 데이터 필드 정의 정보를 분석하고 제출해야합니다. 그런 다음 비즈니스 처리를 한 후 데이터베이스를 제출 한 후 직접 검증 논리 세트를 개발하면주기가 너무 길다. 따라서, 스프링 검증의 구현 원리를 분석하고 다양한 기본 유효성 검사기를 재사용 하였다. 여기서는 스프링 검증 원리를 분석하는 프로세스가 세부 사항으로 들어 가지 않고 기록됩니다.
스프링 유효성 검사를 사용하는 방법
스프링 콩을 초기화 할 때 콩이 JSR-303 사양을 준수하는지 확인하십시오.
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"); Usermodel;} @dataClass usermodel {@notnull (message = "username a n't null") @pattern (regexp = "[a-za-z0-9 _] {5,10}", message = "username") 개인 문자열 username; @Size (min = 5, max = 10, message = "비밀번호 길이는 불법") 개인 문자열 암호;}4. BeanValidationPostProcessor 부피 유형 속성이있는 후 기본적으로 False입니다. False 인 경우, Postprocessbeforeinitialization 프로세스에서 Bean이 확인됩니다. 그렇지 않으면, 콩은 후 프로세스 감소 시설 화 과정에서 확인됩니다.
5.이 검증은 Spring의 BeanPostProcessor Logic을 사용합니다
6. Dovalidate 메소드가 호출되었는지 확인하고 추가로 Validator.validate를 호출하십시오. 기본 유효성 검사기는 HibernateValidator이며, 유효성 검사 -API 패키지는 Java 사양이며 기본 스프링 사양은 최대 절전 모드-밸리 디터 패키지로 구현됩니다. 이 최대 절전 모드 비 정유 프레임 워크 최대 절전 모드
보호 된 void dovalidate (Object Bean) {assert.state (this.validator! = null, "validator set 없음"); set <constraintViolation <object>> result = this.validator.validate (bean);7. HibernateValidator는 기본적으로 ValidatorFactoryImpl을 호출하여 유효성 검사기를 생성 한 다음 ValidatorFactoryImpl을 확장합니다.
방법 수준 JSR-303 사양을 지원합니다
1. 수동으로 MethodValidationPostProcessor Bean을 추가하십시오
2. 클래스에 @Validated 주석을 추가합니다 (사용자 정의 주석도 지원되며 MethodValidationPostProcessor 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 afterProperTiesset () {pointCut pointCut = new` annotationMatchingPointCut` (this.validatedAnnotationType, true); this.advisor = new 'defaultpointCutadvisor` (PointCut, CreateMethodValidationAdvice (this.validator));} 보호 조언 CreateMethodValidationAdvice (@Nullable Validator Validator) {return (validator! = new keth` methodValidationintercept'(검증자);};5. 기본 계층은 또한 유효성 검사기를 생성하기 위해 기본적으로 validatorfactoryImpl을 호출하고 유효성 검사기가 확인을 완료합니다.
다음과 같은 직접 인코딩 호출 검증 로직
공개 클래스 사람 {@notnull (메시지 = "성별이 공허 할 수 없음") 개인 성별 성별; @min (10) 개인 정수 시대; ...} validatorfactory validatorfactory = validation.BuildDefaultValidatorFactory (); validator = validatortory.getValidator (); person.perer (person.cetgender);위와 마찬가지로 ValidatorFactoryImpl에 대한 기본 호출은 유효성 검사기를 생성하도록 호출되고 유효성 검사기는 특정 확인을 완료합니다.
유효하거나 유효성있는 주석을 사용하여 스프링 컨트롤러 메소드 매개 변수에서 확인할 매개 변수에 주석을 달 수 있습니다.
1. 첫째, 봄의 요청 및 통화 프로세스에 익숙해 지십시오.
2. 다양한 Resolvers 처리 요청 매개 변수의 프로세스 중에 매개 변수 검증이 수행되는 것을 알 수 있습니다.
3. 기본 레이어는 데이터베이너의 검증 메소드를 균일하게 호출합니다.
4. Databinder의 역할 : 바인더는 유효성 검사 및 바인딩 결과 분석을 포함하여 속성 값을 대상 객체로 설정할 수있는 바인더, 즉 바인더는 요청에 의해 제출 된 문자열-형식 매개 변수를 처리하고 서버가 실제로 필요한 유형으로 변환합니다. 바인더는 검증을 지원하고 검증 결과를 저장할 수 있습니다.
5. Databinder의 유효성 검사기는 기본적으로 구성 가능한 WebBindingInitializer에서 초기화됩니다. OptionalValidatorFactoryBean은 기본적으로 사용됩니다. 이 Bean은 LocalValidatorFactoryBean을 상속합니다. LocalValidatorFactoryBean은 ValidatorFactory, 사용자 정의 검증 속성 등과 같은 다양한 검증 정보를 결합하고 ValidatorFactoryImpl을 사용하여 기본적으로 Validator를 얻습니다.
이 시점에서 모든 단서는 validatorfactoryimpl을 가리 킵니다. 다음 분석은 다음과 같습니다
public validator`getValidator` () {return`return`createValidator` (restaintvalidatormanager.getDefaultConstraintValidatorFactory (), ValueExtractOrmanager (), valubatorfactoryScopedContext, methodValidationconfiguration);} valudator`valuevalidator '(constraintvalidator). valueExtractorManager, ValidatorFactoryScopedContext validatorFactoryScopedContext, MethodValidationConfiguration methodValidationConfiguration) { BeanMetaDataManager beanMetaDataManager = beanMetaDataManagers.computeIfAbsent( new BeanMetaDataManagerKey( validatorFactoryScopedContext.getParameterNameProvider(), valuePtractOrmanager, MethodValidationConfiguration), key-> new Beanmetadatamanager (`jassainthelper`, executableHelper, typeresolutionHelper, validatorFactoryScopedContext.getParameterNameprovider (), ValueExtractOrmanager, ValidAderTerator, BuildDatapRoviders (), MethodValidConfigerater ()); `return`return validatorimpl` (제한적 ValidatorFactory, Beanmetadatamanager, ValueExtractOrmanager, supgraintValidatorManager, validationArderGenerator, validatorFactoryScopedContext);} public final <t> set <constraintViolation (t object, class <?> groups) {contracts.Asserts.Assertnull (objects.Assnull). messages.validatedobjectmustnotbenull ()); SanityCheckGroups (그룹); ValidationContext <t> validationContext =`getValidationContextBuilder (). ForValidate (Object)`; if (! validationContext.getRootBeanMetadata (). hasconstraints ()) {return collections.emptySet (); } validationArder validationArder = gourmentgroupValidationArder (groups); ValueContext <?, 객체> ValueContext =`valueContext.getLocaleXecutionContext` (validatorscopedContext.getParameterNameprovider (), object, validationContext.getRootBeanMetAdata (), pathimpl.createRootPath ()); return validateInconText (validationContext, ValueContext, validationArder);}1. getValidator-> createValidator-> explatorimpl-> Validate
실행 프로세스 중에 Beanmetadatamanager, ValueContext, ValueContext 및 기타 컨텐츠가 캡슐화되며, 이는 검증 중에 사용될 컨텍스트 정보 (예 : 부모 클래스 및 인터페이스 포함), 속성 및 메소드 파라미터 검증 정보 및 다양한 도구 클래스 (예 : Validator)에서 사용되는 다양한 도구 클래스 (예 : valuthertont)에서 사용되는 다양한 도구 클래스와 같은 Bean의 모든 검증 항목과 같은 컨텍스트 정보입니다. 컨텐츠는 비교적 복잡합니다.
2. 그룹 검증이 무시되고 기본 그룹 처리는 valideconstraintsfordefaultGroup-> valideConstraintSforsIndeFaultGroupElement-> validAmeTeConstraint (참고 : MetAconstraints가 BEAN 유형 및 부모 클래스 및 인터페이스의 모든 검증을 유지 관리하고 ValidemEtAconstraint를 통과해야합니다).
3. Metaconstraint의 DovalidateConstraint 방법을 계속 호출하고 다른 주석 유형에 따라 다른 제한 조건을 따르십시오.
public static <u는 주석을 확장합니다> (제한 조산사 <u>의 constrainttree <u> (compreasionDescriptor, type validatedValueType) {if (compingingDescriptor.getCompositingConstraintImpls (). isempty ()) {return new SimpleconstraintTree <> (compreingsingDescriptor) } else {return new compreingConstraintTree <> (compreasingDescriptor, validatedValueType); }}4. 나는 무엇을 간단하고 무엇을 작곡해야합니까? 둘 다 구속 조건 트리의 'getinitializedconstraintvalidator'방법을 호출하기 때문입니다. 이 단계는 주석 (예 : Decimalmax, Notempty 등)에 해당하는 유효성 검사기를 얻고 유효성 검사기를 초기화하는 데 사용됩니다.
5. ConstraintHelper 클래스는 모든 내장 유효성 검사기를 유지하고 검증 주석 (예 : DecimalMax)에 따라 분류합니다. Validator의 설명 클래스는 다음과 같이 Validator의 일반 템플릿 (예 : bigdecimal)을 유지합니다.
putconstraints (tmpconstraints, decimalmax.class, arrays.aslist (decimalmaxvalidatorforbigdecimal.class, decimalmaxvalidatorforbiginteger.class, decimalmaxvalidatorford.class, decimalmaxvalidatorforflass, decimalmaxvalidatorforlongclass. DecimalMaxValidatorFornumber.class, DecimalMaxValidatorforCharcedEnce.class, DecimalMaxValidatorformonetaryAmount.class));
특정 Bean 클래스의 유효성 검사기를 얻을 때 먼저 주석에 따라 모든 유효성 검사기를 얻습니다. 해당 메소드는 ranstraintManager.FindMatchingValidatordescriptor입니다. 그런 다음 점검중인 객체의 유형에 따라 고유 한 유효성 검사기를 얻습니다.
6. 그런 다음 컨텍스트 정보를 기반으로 초기화 한 다음 Validator의 IsValid 메소드를 호출하여 확인하십시오.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.