패킷 가이드 및 구성
JSR 303 패키지를 가져 와서 유효한 패키지를 최대 절전 모드로 가져옵니다
<pectionency> <groupid> org.hibernate.validator </groupid> <trifactid> Hibernate-Validator </artifactid> <bersion> 6.0.5.final </version> </dependency> <groupid> javax.validation <artifactid> artifactid- palation-api </artifactid> <버전> 2.0.0.Final </version> </fectionency>
스프링 부츠 구성
Resources/Application.yml 메시지 리소스 파일 국제 처리 구성
봄:
메시지 :
Basename : Base, Todo # Resource Files Base.properties and Todo.Properties, 쉼표로 구분
인코딩 : UTF-8 # 구문 분석 인코딩을 지정해야합니다. 그렇지 않으면 중국어가 달린 코드
SpringBoot 스타트 업 클래스에서 구성하십시오
@SpringBootApplicationPublic 클래스 응용 프로그램 확장 webmvcconfigureradapter {@Value ( "$ {spring.messages.basename}") 개인 문자열베이스 이름; public static void main (String [] args) {springApplication.run (application.class, args); } @bean @primary public messageSource messageSource () {resourceBundleMessagesOURCE resourceBundLemessagesOURCE = new ResourceBundLemessagesOURCE (); ResourceBundleMessagesSource.setUcoDeasDefaultMessage (false); ResourceBundleMessagesSource.setDefaultEncoding ( "UTF-8"); // 정의 반복 ResourceBundleMessagesSource.setBasEnames (basename.split ( ",")); ResourceBundLemessagesSource를 반환합니다. } @bean @primary public localValidatorFactoryBean validator () {localValidatorFactoryBean validatorFactoryBean = 새로운 LocalValidatorFactoryBean (); ValidatorFactoryBean.setProviderClass (HibernateValidator.class); validatorfactoryBean.setValidationMessagesSource (messageSource ()); 반환 validatorFactoryBean; } @override public validator getValidator () {return validator (); } / *** 메소드 레벨에서의 단일 매개 변수 검증이 활성화되어 있습니다* / @Bean public methodValidationPostProcessor methodValidationPostProcessor () {return new MethodValidationPostProcessor (); }}우리는 검증 매개 변수를 전달할 수없는 예외를 처리하고 통합 된 예외 캡처를 통해 발생하는 던진을 전달할 수 없습니다.
@controllerAdVice @componentPublic class bindValidexception Handler {@ReSponsesTatus (value = httpstatus.ok) @exceptionHandler (suptraintViolationException.class) public @ResponseBody msg handleConstraintViolationException (string messagetemplate = string messagetemplate = e.getConstraintViolations (). iterator (). next (). getMessAgetemplate (); 반환 msg.error (messagetemplate); } @ResponSestatus (value = httpstatus.ok) @exceptionhandler (bindexception.class) public @ResponseBody msg handleBindException (bindexception e) {bindingResult bindingResult = e.getBindingResult (); 문자열 className = bindingResult.getTarget (). getClass (). getName (); Fielderror next = bindingResult.getFielderrors (). iterator (). next (); String FieldName = next.getField (); 문자열 defaultMessage = next.getDefaultMessage (); if (pattern.compile ( "불법 행위 값은 : enum 없음"). matcher (defaultmessage) .find ()) {matcher matcher = pattern.compile ( "value"(.*?) "). 매치 자 (defaultmessage); if (matcher.find ()) {defaultMessage = "열거 유형을 찾을 수 없습니다 [" + matcher.group (1) + "]; }} return msg.error (defaultMessage); } @ResponSestatus (value = httpstatus.ok) @exceptionHandler (validError.class) public @ResponseBody msg handleValidError (validError e) {return msg.error (e.getMessage ()); }}리소스/base.propertie
CreatorID = Creator ID는 {value}보다 작을 수 없습니다.
modifierid = modifier id는 {value}보다 작을 수 없습니다.
자원/todo.properties
todo.privateid.min = private id는 {value}보다 작을 수 없습니다.
그룹의 C 및 S 인터페이스가 삽입 인터페이스, 업데이트 인터페이스 등을 포함한 컨트롤러 및 서비스의 약어를 참조하는 Bean 필드에 주석을 사용하십시오.
/*** Private ID는 프로젝트 작업/비영리 작업/위험/문제/문제/검토 할 예정 질문*/@min (value = 1, message = "{todo.privateid.min}", Groups = {c.insert.class, c.update.class, s.insert.class, s.update.crals}))와 같은 여러 테이블을 나타내는 외국 키입니다. */@min (value = 1, message = "{creatorid}", groups = {s.insert.class}) private long creatorid; 컨트롤러 제어 레이어 valided@validated@restcontroller@restontroller@requestmapping ( "todo") public class todocontroller {@autoired private todoservice todoService; @GetMapping ( "getVo") public msg getVo (@min (value = 1, message = "do do do do do id는 1보다 작을 수 없습니다. } @postmapping ( "add") public msg add (@validated ({c.insert.class}) todo todo) {return this.todoService.add (todo); }}@Validated ({c.insert.class})는 Bean 주석에 대한 검증 그룹을 활성화하도록 선언하며, 다른 확인 그룹은 검증을 수행하지 않으며, 이는 별도의 검증을 위해 구별 될 수 있습니다.
예를 들어, 엔티티가없고 기본 데이터 유형이 하나만 있으면 확인할 수 있지만 세 가지 조건을 충족해야합니다.
혼자서 확인하십시오.
서비스 서비스 계층 AOP 확인
validUtil 도구 클래스
SpringBoot로 스캔하고 단일 케이스로 등록해야합니다.
@componentpublic class validUtil {@autowired private validator validator; public <t> set <constraintViolation <t >> validate (t 객체, class <?> ... 그룹) {return validator.validate (Object, Groups); } public <t> set <constraintViolation <t >> validateValue (class <t> beantype, String value, 객체 값, 클래스 <?> ... 그룹) {return validator.validateValue (beantype, propertyname, value, groups); } / *** 매개 변수를 확인하고 첫 번째 오류 프롬프트* @param t 검증 된 객체* @param 그룹 검증 그룹* @param <t> 객체를 지우기 전에* @return first error 프롬프트* / public <t> void validandreturnfirsterrortips (t t, class <?> ... 그룹) {set <constraintViolation <t >> validator.validate (t,); if (validate.size ()> 0) {제한 범위화 <T> next = validate.iterator (). next (); 문자열 메시지 = next.getRootBeanClass (). getName () + "-" + next.getPropertyPath () + "-" + next.getMessage (); 새로운 validError (메시지)를 던지십시오. }} / *** 매개 변수를 확인하고 첫 번째 오류 프롬프트를 반환합니다. @param targetclass 검증 된 객체의 클래스 유형* @param obj 속성 값이 필요한* @Param Group Group verification group* @param <t> @Return 첫 번째 오류 프롬프트* / public <T> public <T> void void Validturn FABLETHORN, void validturn fartorbertras, void validturn firtorhondrast, string validturn firtorber validturn firtrass 이전에 원래 유형을 유효성으로 확인해야합니다. obj, class <?> ... 그룹) {set <suptraintViolation <t >> validate = validator.validateValue (targetclass, fieldName, obj, groups); if (validate.size ()> 0) {String Message = TargetClass.getName () + "-" + fieldName + "-" + validate.iterator (). next (). getMessage (); 새로운 validError (메시지)를 던지십시오. }}}AOP 구성
주요 원칙은 AOP 인터셉트 방법을 사용하여 매개 변수를 실행하고 매개 변수에 대한 주석을 얻는 것입니다. 그런 다음 공구 클래스를 사용하여 매개 변수를 확인하십시오. 확인이 실패하면 사용자 정의 오류가 직접 발생하고 사용자 정의 오류가 전 세계적으로 처리되었습니다.
@agage @componentpublic class validatoraop {@autowired private validutil validUtil; /*** 인터 셉션 규칙 정의 : com.service 패키지 아래의 모든 클래스를 가로 채면 @Service 주석이있는 메소드가 있습니다. */ @PointCut ( "Execution (*com.service ..*(..)) 및 @annotation (org.springframework.stereotype.service)") public void controllemedodpointcut () {}/ ***인터셉터의 특정 구현*/ @around ( "ControlleMethodpointCut ()"// interceptor 규칙을 지정합니다. 이 공개 객체 인터셉터 (praceingjoinpoint pjp) {methodsignature methodsignature = (methodsignature) pjp.getSignature ()에 직접 쓸 수 있습니다. 메소드 메소드 = methodSignature.getMethod (); 주석 [] [] argannotations = method.getParameterAntations (); Object [] args = pjp.getargs (); for (int i = 0; i <args.length; i ++) {for (주석 주석 : argannotation [i]) {if (validated.class.isinstance (annotation)) {validated validated = (검증 된) 주석; class <?> [] groups = validated.value (); validUtil.validandreturnFirsterRortips (args [i], 그룹); }} try {return pjp.proceed (args); } catch (Throwable Throwable) {Throwable.printstacktrace (); } true를 반환합니다. }}주석 @min @notnull 사용 방법을 확인하십시오
구현 클래스에서 작성할 수 없으므로 인터페이스에서 주석 만 사용할 수 있습니다.
기본적으로 컨트롤러와 동일한 방식입니다
@ValidatedPublic Interface todoservice { / *** 쿼리 단일 할 일 단일 할 일 do* @param id Serial Number* @return single to-do* / msg getVo (value = 1, message = "to-do id가 1보다 작을 수 없습니다.") 긴 ID); / *** 데이터 추가* @param todo object*/ msg add (@validated ({s.insert.class}) todo todo);}몇 가지 사용자 정의 검증 주석을 공유하십시오
문자열 null 검증
package javax.validation.constraints; import javax.validation.constraint; import javax.validation.constraintvalidator; import javax.validation.constraintvalidatorcontext; import javax.validation.payload.payload.lang.annotation. 사용할 수 없으며 다시 작성해야합니다. 패키지를 변경할 수 없습니다. */@documented@constraint (validatedby = {notblank.notblankvalidator.class})@target ({elementtype.field, elementtype.annotation_type, elementtype.parameter})@resentention (rendentpolicy.runtime) public@interface {class <?> groupt () default (); 문자열 메시지 () 기본 "{notblank}"; 클래스 <? payload> [] payload () default {}을 확장합니다. 클래스 notblankvalidator <notblank, object> {public notblankvalidator () {} @override public void initialize (notblank restaintannotation) {} @override public boolean isvalid (객체 값, sucfaintValidatorcontext conte! }}}유형 유형, 유형이 값 중 하나인지 판단하려면 검증 그룹을 기반으로 판단을 사용자 정의 할 수 있습니다.
Resources/todo.propertiestodo.todotype.insert = 새로 추가되면 할 일 유형은 비영리 작업, 프로젝트 작업 또는 문제 중 하나 일 수 있습니다. todo.todotype.update = 수정할 때 할 일 유형은 위험 중 하나 일 수 있으며 할 일 문제를 검토 할 수 있습니다. bean/*** todotype0non-project task1project 2problem3risk4reviewtodotypevalid (value = { "0", "1", "2"}, messag "4"}, message = "{todo.todotype.update}", groups = {c.update.class, s.update.class}) 개인 문자열 토피 형;맞춤형 주석
@documented@constraint (validatedby = {todotypevalid.todotypevalidfactory.class})@target ({elementtype.field, elementtype.annotation_type, elementtype.parameter})@retention (resentionpolicy.runtime) @repeatable (weDotypevalid.listevalid) {String Message () 기본값 "올바른 유형을 입력하십시오"; 문자열 [] value () default {}; class <?> [] groups () default {}; 클래스 <? payload> [] payload () default {}을 확장합니다. 클래스 todotypevalidfactory는 제약 Validator <todotypevalid, String> {private String [] annotationValue; @override public void initialize (todotypevalid todostatusvalid) {this.annotationvalue = wordostatusvalid.value (); } @override public boolean isvalid (문자열 값, 제한 ValidatorContext context) {if (arrays.aslist (annotationValue). contains (value)) return true; 거짓을 반환합니다. }}} @target ({elementtype.field, elementType.annotation_type, elementType.parameter}) @retention (resentpolicy.runtime) @documented @interface list {todotypeValid [] value (); }}@repeatable (wedotypevalid.list.class)은 JDK8에서 지원하는 동일한 주석 다중 시간 기능입니다.
위의 내용에 따르면, 열거 클래스에도 사용할 수 있습니다.
Resources/todo.propertiestodo.todostatus.insert = 새로 추가하면 상태를 시작할 수 없습니다. todo.todostatus.update =가 수정 될 때 상태는 진행 중이거나 완료 될 수 있습니다. bean/*** todo 상태 0이 시작되지 않음 1 진지대 2 완료*/@todostatusvalid (enums = {todostatus.not_started}, message = "{todo.todostatus.insert}", groups = {c.insert.class, s.insert.class})@todostatusvalid (enums. todostatus.completed}, message = "{todo.todostatus.update}", groups = {c.update.class, s.update.class}) private todostatus todostatus;맞춤형 주석
@documented@constraint (validatedby = {todostatusvalid.todostatusvalidfactory.class})@target ({elementtype.field, elementtype.annotation_type, elementtype.parameter})@retention (retentionpolicy.runtime) @repeatable (todostatusvalid.list.class) TodostatusValid {String Message () 기본값 "올바른 상태를 입력하십시오"; Todostatus [] enums () default {}; class <?> [] groups () default {}; 클래스 <? payload> [] payload () default {}을 확장합니다. 클래스 Todostatusvalidfactory는 제약 조건을 구현합니다. @override public void initialize (Todostatusvalid todostatusvalid) {this.enums = todostatusvalid.enums (); } @override public boolean isvalid (Todostatus value, rantaintValidatorContext context) {todostatus [] value = todostatus.values (); if (enums! = null && enums.length! = 0) {value = enums; } if (arrays.aslist (value). contains (value)) return true; 거짓을 반환합니다. }}} @target ({elementtype.field, elementType.annotation_type, elementType.parameter}) @retention (resentpolicy.runtime) @documented @interface list {todostatusvalid [] value (); }}요약
위의 내용은 SpringBoot에 소개 된 편집기가 JSR 303을 사용하여 컨트롤러 제어 계층과 서비스 서비스 계층 AOP 확인을 확인하는 것입니다. 메시지 자원 파일을 사용하여 메시지를 국제화하십시오. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!