1 : 최대 절전 모드-검증기 기본
1. 소개 :
주석 주석을 사용하여 클래스 또는 클래스의 속성에 제약 조건을 추가하면 런타임 동안 속성 값의 합법성을 확인하십시오.
2. 기능 :
클라이언트가 매개 변수를 적게 전달하거나 값이 불법이거나 매개 변수 값이 악의적이기 때문에 매개 변수 검증은 API 인터페이스 개발에서 매우 중요합니다. 따라서 클라이언트가 전송 한 매개 변수의 합법성을 확인해야합니다. 그중에서도 주석을 통해 매개 변수 값의 검증 규칙을 속성에 주석을 달리는 것은 비교적 우아한 방법입니다.
3. 일반적으로 사용되는 제약 주석
4. 최초의 최대 절전 모드-발전기를 얻으십시오
공개 클래스 주소 {@notnull 개인 문자열 line1; 개인 문자열 라인 2; 개인 문자열 zip; 개인 문자열 상태; @length (max = 20) @notnull 개인 문자열 국가; @Range (min = -2, max = 50, message = "범위에서 바닥") public int floor; // getter && setter}둘 : 최대 절전 모드 검증을 통합하십시오
이 예제는 SpringMVC+FastJSON 통합 (//www.vevb.com/article/139094.htm)을 기반으로 통합됩니다. 먼저이 기사 (다운로드 소스 코드 포함)를 살펴 보고이 기사를 기반으로 최대 절전 모드 밸리 디터를 통합 할 수 있습니다.
통합 단계 :
1. pom.xml에 최대 절전 모드-검증기 의존성을 소개하십시오
<pectionency> <groupid> org.hibernate </groupid> <artifactid> Hibernate-Validator </artifactid> <버전> 5.4.1.final </version> </fectionency>
2. [xxx] -servlet.xml : hibernatevalidator에서 유효성 검사기를 구성하십시오
<!-<mvc : annotation-driven> add add add add add add add add add add add aitce validator = "validator"-> <mvc : mvc "> <mvc : messe-converters register-defaults ="true "> <!-원래 Jackson 지원을 대체하도록 fastjson-> <poaty name = <spropert name ="sporpedmediatepes ". <value> text/html; charset = utf-8 </value> <value> application/json </value> </list> </propertion> <속성 이름 = "feature"> <list> <value> quotefieldnames </value> <value> writemapnullvalue </value> </list> </propert> </bean> </mvc : annot-conver> id = "validator"> <property name = "providerclass"value = "org.hibernate.validator.hibernatevalidator"/> <property name = "validationMessageSource"ref = "messageSource"/> </bean> <bean id = "messageSource"> <property name = "basenames"> <value> class/vallys/validations/validations/validations/vallyss/values/values. <value> classpath : org/hibernate/validator/validationmessages </value> </list> </property> <속성 이름 = "usecodeasdefaultmessage"value = "false"/<property name = "defaultencoding"value = "utf-8"/> <속성 이름 = "cacheseconds"60 "/> </bean>
3. 확인 메시지 파일 정의 파일 설명 유효성 검사.
validation.common.null =이 필드는 빈 유효성 검사가 될 수 없습니다 .Common.not.range = 길이 불법 유효성 검사 .common.error = 형식 오류 유효성 검증.
4. 테스트를위한 새 엔티티 클래스를 만듭니다
사용자 엔티티
package com.mengdee.manage.validator; import javax.validation.constraints.min; import javax.validation.constraints.notnull; import javax.validation.constrints.null; import javax.validation.constrantaks.pattern; import org.hibernate.validator org.hibernate.validator.constraints.length; import org.hibernate.validator.constraints.notblank; public class userentity {@null (groups = {groupa.class}) @notnull (groups = {groupb.class}) @min (value = 1, message = "valse vere in 0 이상 개인 긴 ID; @NotBlank (groups = {groupa.class, groupb.class}) @pattern (regexp = "^(?! [0-9]+$) (?! Groupb.class}) 개인 문자열 비밀번호; @NotBlank (groups = {groupa.class, groupb.class}) @pattern (regexp = "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9]) // d {8} $", Message = "Private String"); @NotBlank (groups = {groupb.class}) @length (min = 6, max = 12, message = "별명 길이는 6 ~ 12 비트") 개인 문자열 닉네임; @min (value = 18, message = "{validation.param.age}") 개인 int 연령; @NotBlank (groups = {groupa.class}) @email (message = "{validation.common.format.error}") 개인 문자열 이메일; @notblank @length (min = 3, max = 10, message = "{validation.common.not.range}") 개인 문자열 사용자 이름; public userentity () {} public long getId () {return id; } public void setId (long id) {this.id = id; } public String getNickName () {return 닉네임; } public void setNickName (문자열 별명) {this.nickName = 별명; } public int getage () {반환 연령; } public void 설정 (int Age) {this.age = age; } public String getEmail () {반환 이메일; } public void seteMail (문자열 이메일) {this.email = 이메일; } public String getPassword () {return password; } public void setpassword (문자열 비밀번호) {this.password = password; } public String getUserName () {return username; } public void setusername (String username) {this.username = username; } public String getPhone () {반환 전화; } public void setphone (String Phone) {this.phone = 전화; }}usermodel
package com.mengdee.manage.validator; import javax.validation.constraints.min; import javax.validation.constraints.pattern; import org.hibernate.validator.constraints.email; import org.hibernate.validator.constraints.length; import org.hibernate.validator.constraints.notblank; public class usermodel {@min (value = 1, messag @notblank @length (min = 6, max = 12, message = "별명 길이는 6 ~ 12 자리") 개인 문자열 별명; @min (value = 18, message = "{validation.param.age}") 개인 int 연령; @notblank @email (message = "{validation.common.format.error}") 개인 문자열 이메일; @notblank @pattern (regexp = "^(?! [0-9]+$) (?! [a-za-z]+$) @notblank @length (min = 3, max = 10, message = "{validation.common.not.range}") 개인 문자열 사용자 이름; @notblank @pattern (regexp = "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9])) // d {8} $", message = "오르막 전화 번호 형식은"개인 문자열 전화; public usermodel () {} public long getid () {return id; } public void setId (long id) {this.id = id; } public String getNickName () {return 닉네임; } public void setNickName (문자열 별명) {this.nickName = 별명; } public int getage () {반환 연령; } public void 설정 (int Age) {this.age = age; } public String getEmail () {반환 이메일; } public void seteMail (문자열 이메일) {this.email = 이메일; } public String getPassword () {return password; } public void setpassword (문자열 비밀번호) {this.password = password; } public String getUserName () {return username; } public void setusername (String username) {this.username = username; } public String getPhone () {반환 전화; } public void setphone (String Phone) {this.phone = 전화; }}userDetail :
package com.mengdee.manage.validator; import org.hibernate.validator.constraints.notblank; public class userDetail {private long id; @NotBlank 개인 문자열 주소; @NotBlank 개인 문자열 회사; public userDetail () {} public long getId () {return id; } public void setId (long id) {this.id = id; } public String getAddress () {return address; } public void setAddress (문자열 주소) {this.address = 주소; } public String getCompany () {return Company; } public void setCompany (String Company) {this.company = Company; }}ValidController로 테스트
package com.mengdee.manage.controller; import javax.servlet.http.httpservletrequest; import javax.validation.valid; import org.spramframework.stereotype.controller; import org.springframework.validation.bindingresult; import; org.springframework.validation.fielderror; import org.springframework.bind.annotation.requestmapping; import org.springframework.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.rongebody; import; com.mengdee.manage.validator.usermodel;@controller@requestmapping ( "/valid") public class validcontroller 확장베이스 컨트롤러 {// http : // localhost : 8081/platform-springmvc-webapp/valid/test? age=18&nickname=mengdee&id=1&[email protected]=Root123&username=123&phone=18321758957 @RequestMapping (values = request.get) @ResponseBody 객체 유효성 검증 (httpservletrequest request, @valid usermodel user, bindingResult bindingResult) {if (bindingResult.haserRors ()) {fielderror fielderror = bindingResult.getFielderror (); Super.responseJsonerror (Fielderror)를 반환합니다. } "OK"를 반환합니다. } // 여러 객체를 동시에 확인하는 메소드는 여러 결과 바인딩 리그를 바인딩해야합니다. @Valid가 나타나고 나중에 선언 된 BindingResult에 해당합니다. @requestmapping (value = "/test2", method = requestmethod.get) public @responsebody 객체 객체 validationmore (httpservletrequest request, @valid usermodel user, bindingresult bindingresult, @valid userDetail userDetail, felyerresult.haserrors (If) {) Fielderror = BindingResult.getFielderror (); Super.responseJsonerror (Fielderror)를 반환합니다. } if (bindingResult2.haserRors ()) {fielderror filederror = bindingResult2.getFielderror (); Super.responseJsonerror (Fielderror)를 반환합니다. } "OK"를 반환합니다. }}사용에 대한 메모 :
1. 여러 필드의 경우 시스템 검증 순서는 마치 불필요한 것처럼 필드 선언 순서와는 다른 것 같습니다.
2. 각 검증의 경우 메시지 속성이 없으면 해당 @NotBlank가 @NotBlank와 동일합니다 (Message = "NAVE BE BEYM")과 같은 시스템은 기본값을 사용합니다.
3. String과 같은 참조 유형의 경우 @notnull, @notempty 또는 @notblank와 함께 사용해야합니다. 빈 구속 조건을 작성하지 않으면 테스트 후이 필드는 검증에 참여하지 않습니다. @Pattern, @Length, @Email 등을 사용하는 경우 만 확인되지 않습니다. 빈 제약 조건을 사용하여 제한해야합니다.
@MIN : int, long 등과 같은 기본 데이터 유형에 사용됩니다.
@NotNull : 모든 객체의 값은 null이 될 수 없습니다
@Notempty : 컬렉션 객체의 요소는 0이 아닙니다.
@NotBlank : 문자열에만 사용할 수 있으며 String trim ()의 길이는 0보다 클 것입니다.
3 : 그룹 확인 @Validated
1. 그룹화의 역할 (시나리오 사용) :
각 검증 주석 제한 조건에는 그룹 속성이 있으며,이 속성은 제약 조건이 속한 그룹을 지정하는 데 사용됩니다. 이러한 방식으로, 동일한 필드에서 여러 구속 조건 세트를 구성 할 수 있습니다. 그것을 사용할 때 사용할 수있는 제약 조건 세트 만 지정하면됩니다. 예를 들어, 사용자를 등록하고 사용자 정보를 수정할 때 등록 할 때 ID를 비워야하며 사용자 정보를 수정할 때 ID를 비워지지 않아야합니다. 그것을 사용할 때는이 두 가지 제약 조건을 다른 그룹에만 할당하면됩니다. 예를 들어, 추가 할 때 그룹 A의 제약 조건을 사용하고 업데이트 할 때 그룹 B의 제약 조건을 사용합니다.
2. 패킷은 빈 인터페이스입니다
Groupa와 GroupB
package com.mengdee.manage.validator; public interface groupa {} 패키지 com.mengdee.manage.validator; public interface groupb {}@validated를 사용할 때 ({groupa.class})
3. 그룹 시퀀스 @group equessence
기본적으로, 상이한 그룹의 제약 조건 검증은 정렬되지 않으며, 그룹 시퀀스는 먼저 GroupA 그룹의 제약 조건을 확인한 다음 GroupB 그룹의 제약 조건을 확인하는 등 순서 전후에 그룹에서 순서대로 확인됩니다. 예를 들어 그룹의 확인 순서에 대한 요구 사항이있는 경우 먼저 그룹 A를 확인한 다음 그룹 B를 확인해야합니다. @GroupEdecidence를 사용하여 각 그룹의 순서를 정의 할 수 있습니다.
시나리오 사용 :
(1) 두 번째 그룹의 제약 검증은 실행할 안정적인 상태에 의존하며,이 안정적인 상태는 첫 번째 그룹에 의해 확인됩니다.
(2) 특정 그룹의 검증은 시간이 많이 걸리고 CPU 및 메모리 사용률은 비교적 큽니다. 최선의 선택은 검증을 위해 지속되는 것입니다. 따라서 그룹 검증을 수행 할 때는 그룹 시퀀스의 개념을 제안하는 질서 정연한 검증 방법이 여전히 필요합니다.
그룹은 다른 그룹의 순서로 정의 될 수 있으며 검증에 사용될 때 시퀀스에 지정된 순서를 준수해야합니다. 그룹 시퀀스 검증을 사용하는 경우, 시퀀스 전에 그룹 검증이 실패하면 후속 그룹은 더 이상 검증되지 않습니다.
주석 그룹 시퀀스 : GroupAB를 사용하여 그룹 시퀀스를 정의하십시오
package com.mengdee.manage.validator; import javax.validation.groupsequence; @groupsequence ({groupa.class, groupb.class}) public interface groupab {ValidationController
package com.mengdee.manage.controller; import javax.servlet.http.httpservletrequest; import org.spramepramework.stereotyp.controller; import org.springframework.validation.bindingresult; import org.springframework.fielderor; org.springframework.validation.annotation.validated; import org.springframework.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.bind.bind.rontation .rongebody; com.mengdee.manage.validator.groupa; import com.mengdee.manage.validator.groupab; import com.mengdee.manage.validator.groupb; import com.mengdee.manage.validator.userentity;@controller@requestmapping ( "/validated") vasytendroller excontroller in excontroller 검증 중에 지정되어 GroupA를 포함하는 제약 조건 만 확인됩니다. 포함이 없으면 검증이 없습니다. 예를 들어, 전화의 경우 @NotBlank로 지정된 그룹 및 @Pattern은 그룹을 지정하지 않으면 하나의 제약 조건 만 비어 있고 휴대폰 번호 형식은 // http : // localhost : 8081/platform-springmvc-webapp/validated/groupa? password = root123 & phone = 123 @requestmapping (value =/mether = " requestMethod.get) public @responsebody object groupa (httpservletrequest request, @validated ({groupa.class}) userentity user, bindingresult bindingResult) {if (bindingresult.haserrors ()) {fielderror fielderror = bindingresult.getfielderror (); responsejsonerror (Fielderror); } "OK"를 반환합니다. } // http : // localhost : 8081/platform-springmvc-webapp/validated/groupb? phone = 123 & password = root123 & id = 1 @requestmapping (value = "/groupb", requestmethod.get) public @respronse body 객체 그룹B (httpervletrequest request, @validated (validated) bindingResult bindingResult) {if (bindingResult.haserRors ()) {fielderror fielderror = bindingResult.getFielderror (); responsejsonerror (Fielderror); } "OK"를 반환합니다. } // groupab // http : // localhost : 8081/platform-springmvc-webapp/validated/groupab? phone=111&password=root123&nickname=123&[email protected] // @validated ({groupa.class, groupb.class}) : 데이터베이스. 한 조건이 충족되는 한 제약 조건이 확인됩니다. 여러 그룹을 사용하여 여러 그룹간에 순서대로 속성이 없다는 점에 유의하십시오. 그룹 A를 먼저 확인한 다음 그룹 B를 확인하는 것이 아닙니다. // ID의 제약 조건이 비어 있고 비어 있지 않기 때문에 속성은 먼저 @requestmapping (value = "/groupab", method = requestod.get) public @Response 객체 GroupAB (httPervletRequest request, @Validated ({groupa.class,}). bindingResult bindingResult) {if (bindingResult.haserRors ()) {fielderror fielderror = bindingResult.getFielderror (); responsejsonerror (Fielderror); } "OK"를 반환합니다. } // default // http : // localhost : 8081/platform-springmvc-webapp/default? email=xxx@age=18 // @validated 그룹이 지정되지 않은 경우 그룹 속성이 없음을 확인하십시오 (현재 @Valid 함수와 동일). 필드에 여러 제약 조건이있는 경우 그룹을 지정해서는 안됩니다. 지정된 그룹이 부분적으로 제한되어 있고 부분 제약 조건이 제약 조건을 지정하지 않으면 @Validated @ResponseBody Object DefaultGroup (httpservletRequest request, @Validated user user, if indult)를 사용할 때 @requestmapping (value = "/default", method = requestmethod.get)이 확인되지 않습니다. (bindingResult.haserRors ()) {Fielderror Fielderror = bindingResult.getFielderror (); responsejsonerror (Fielderror); } "OK"를 반환합니다. } // LocalHost : 8081/Platform-SpringMVC/Webapp/Validated/Sequence? Phone = 123 & password = 123 & elume = 123 & kickname = 123 // 속성에 대한 여러 제약 조건이 동일한 그룹에서 모두 동일한 그룹에있는 것은 아니며, @recements (value =/sigrance)에 따라 점검 순서가 모두 확인됩니다. requestMethod.get) public @responsebody 객체 순서 (httpservletrequest request, @validated ({groupab.class}) userentity user, bindingresult bindingResult) {if (bindingresult.haserrors ()) {fielderror fielderror = bindingresult.getfielderror (); responsejsonerror (Fielderror); } "OK"를 반환합니다. }}4 : 사용자 정의 최대 절전 모드 검증 주석
Hibernate Validation에서 제공 한 주석이 요구 사항을 충족 할 수없는 경우 검증 제약 조건을 사용자 정의 할 수 있습니다.
사용자 정의 주석 제약 조건 단계 :
@phone 주석을 만듭니다
package com.mengdee.manage.validator; import java.lang.annotation.target; import javax.validation.constraint; import javax.validation.payload; import static java.lang.annotation.lementtype.annotation_type; import java.lang.annotation.elementtype.crestation; java.lang.annotation.elementtype.field; static java.lang.annotation.elementtype.method import static java.lang.annotation.elementtype.parameter; import static java.lang.annotation.retentionpolicy.runtime; import java.lang.documumented java.lang.annotation.retention; @target ({method, field, annotation_type, constructor, parameter})@retention (runtime)@documented@constraint (validatedby = {phoneconstraint.class}) public @Interface {string message () 기본 전화 번호 형식 오류 "; String regexp () default "^((13 [0-9]) | (15 [^4, // d]) | (18 [0,3-9])) // d {8} $"; class <?> [] groups () default {}; 클래스 <? payload> [] payload () default {}을 확장합니다. @target ({method, field, annotation_type, constructor, parameter}) @retention (runtime) @documented public @interface list {phone [] value (); }}휴대폰 번호의 주석에 해당하는 제한 조건 검증 클래스 생성
package com.mengdee.manage.validator; import javax.validation.constraintvalidator; import javax.validation.constraintValidatorContext; public class phoneconstraint impless restaintvalidator <phone, string> {private string regexp; @override public void initialize (전화 phoneannotation) {this.regexp = phoneannotation.regexp (); } @override public boolean isvalid (문자열 값, restaintValidatorContext 컨텍스트) {if (value == null) {return true; // hv000028 : isvalid 호출 중 예기치 않은 예외} if (value.matches (regexp)) {return true; } false를 반환합니다. }}속성에 주석 @phone을 사용하십시오
package com.mengdee.manage.validator; import org.hibernate.validator.constraints.notblank; public class userDetail {@notblank @phone private string phone; public userDetail () {} public String getPhone () {return Phone; } public void setphone (String Phone) {this.phone = 전화; }}테스트 노트
// http : // localhost : 8081/platform-springmvc-webapp/valid/test3? address = 123 & company = 456 & phone = 123 @requestmapping (value = "/test3", method = requestmethod.get) public @responsebody customannotation (httpsercquest request, @valid userdeteale userdettake bindingResult) {if (bindingResult.haserRors ()) {fielderror fielderror = bindingResult.getFielderror (); Super.responseJsonerror (Fielderror)를 반환합니다. } "OK"를 반환합니다. }전체 코드를 다운로드하십시오 : http://xiazai.vevb.com/201804/yuanma/platform-springmvc-webapp(Vevb.com).rar
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.
참조 기사 :