이 기사는 검증 단계를 도입하는 방법, 사용자 정의 검증을 통해 코드 양을 줄이고 생산성을 향상시키는 방법을 간략하게 소개합니다. 특별 언급 : 비-프리맨티 유형 속성의 유효, GET 메소드 처리, 유효성 검사 오류 메시지의 통합 해상도.
이 기사의 실제 검증 구현은 처리를위한 최대 절전 모드 검증을 위해 위임됩니다.
기본 구성
POM은 Maven 의존성을 소개합니다
<!-검증 시작-> <pectinement> <groupId> javax.validation </groupid> <artifactid> validation-api </artifactid> <bersion> 1.1.0.final </version> </dependency> <groupId> org.hibernate </groupIdid> artifactid> hibernate-validator </artifactid> <버전> 5.4.0.Final </version> </fectionency> <!-유효성 검사 종료->
유효성 검사 구성을 추가하십시오
Spring-MVC-Servlet.xml에 다음 구성을 추가하십시오.
<MVC : 주석 구동 유효성 검증기 = "Validator"> <bean id = "validator"> <property name = "providerclass"value = "org.hibernate.validator.hibernatevalidator"/<property name = "validationMessource"ref = "messages a everce"// aightsource는 응용 프로그램을보십시오
사용자 정의 예외 처리기
유효성 검사 오류 메시지를 개인화하면 발신자에게 반환 된 정보가 더 친절합니다. 다음 구성이 ApplicationContext.xml에 추가됩니다.
<!-I18N 메시지 자원 파일을로드-> <bean id = "messageSource"> <property "> <property name ="basenames "> <stenames"> <list> <alue> errormsg </value> <value> validation_error> </list> </property> </bean> <bean id = "valicationExceptionResolver"/>
Project ClassPath에 추가 : validation_error_zh_cn.properties 리소스 파일 :
#입력 유효성 검사에 대한 오류 MSG#commerfield.can.be.be.be.be.be.be.be.be.be.be.b.can.can.be.be.empty = {field}는 비어 있거나 비어 있거나 빈 문자열 필드가 될 수 없거나 비어 있지 않거나 비어 있지 않아야합니다. ValidationExceptionResovler 구현 :
ValidationExceptionResovler.java
@slf4jpublic class validationExceptionResovler 확장 attracthandlerexceptionResolver {public validationExceptionResovler () {// 순서를 설정하고 this.setorder (0); } /** * * a {@link} 또는 {@link}와 같이 {@code @valid}로 주석이 달린 인수가 유효성 검사에 실패한 경우를 처리합니다. * <p> * Custom ValidationException Exception handler * 특정 유효성 검사 오류 메시지를 받고 CommonResponse를 조립하고 발신자에게 반환합니다. * * @param 요청 현재 HTTP 요청 * @param 응답 전류 HTTP 응답 * @param handler 실행 된 핸들러 * @return 예외가 처리되었음을 나타내는 빈 모델 및 뷰는 응답에서 잠재적으로 던질 수 있습니다 .SendError () */ @ResponseBody Protected ModelANDVIEW HANDLEMEDOCGUMMENT (BINDOUCTEMENTOUCTUM, httpservletrequest 요청, httpservletresponse 응답, 객체 핸들러)는 ioexception {list <sbjecterror> errors = bindingResult.getallerRors (); StringBuffer errmsgbf = new StringBuffer (); for (objecterror errors : errors) {문자열 mass = error.getDefaultMessage (); errmsgbf.append (마사지); errmsgbf.append ( "||"); } string errmsgstring = errmsgbf.tostring (); errmsgstring = errmsgstring.length ()> 2? errmsgstring.substring (0, errmsgstring.length () -2) : errmsgstring; log.error ( "검증 실패! {}", errmsgstring); map <string, object> map = new Treemap <String, Object> (); map.put ( "성공", 거짓); map.put ( "ErrorCode", "9999"); map.put ( "errormsg", errmsgstring); modelandView mav = 새로운 modelAndView (); 매핑 Jackson2jsonView보기 = 새로운 매핑 Jackson2jsonView (); view.setattributesmap (map); mav.setView (보기); 반환 mav; } @Override Protected ModelandView DoresolveException (httpservletrequest request, httpservletResponse 응답, 객체 핸들러, 예외) {bindingResult bindingResult = null; if (ex instanceof methodArgumentNotValidexception) {bindingResult = ((MethodArgumentNotvalidexception) ex) .getBindingResult (); } else if (ex instanceof bindException) {bindingResult = ((bindException) ex) .getBindingResult (); } else {// 기타 예외, 무시} if (bindingResult! = null) {try {return handlemethodargumentNotvalidexception (bindingResult, 요청, 응답, 핸들러); } catch (ioexception e) {log.error ( "doresolvexception :", e); }} return null; }} 컨트롤러에 @Valid를 추가하십시오
@requestmapping ( "/buy")@responsebodypublic baseresponse buy (@requestbody @valid buyflowerrequest 요청) 예외 {// ......} 요청 bean에서 유효성 검사가 필요한 속성에 유효성 검사 주석 추가
@setter@getterpublic class buyflowerrequest {@notempty (message = "{name.can.not.be.null}") 개인 문자열 이름;} 보조 객체의 검증
위의 쓰기 방법은 BuyflowerRequest의 기본 유형 속성 만 확인할 수 있지만 객체 속성의 속성을 검증 할 방법은 없습니다. 보조 객체의 속성을 검증 해야하는 경우 @Valid 및 특정 유효성 검사 주석을 2 차 객체 및 보조 객체 속성에 동시에 추가해야합니다.
다음 글쓰기 방법 :
@setter @getterpublic class buyflowerrequest {@notempty (field = "bianname") 개인 문자열 이름; @min (field = "price", value = 1) 개인 int 가격; @NotNull 개인 목록 <PayType> PayTypElist;} @setter @getterpublic 클래스 PayType {@Valid @Min (value = 1) private int paytype; @Valid @Min (value = 1) Private int PayAmount;} 인코딩 수를 더욱 줄입니다
인코딩 워크로드를 줄이려면 사용자 지정 유효성 검사 주석을 통해 제출 된 유효성 검사 이름을 오류 메시지의 리소스 파일로 전달하여 각 도메인에 대해 다른 메시지 템플릿을 쓰지 않도록하십시오.
다음은 다시 쓰기 @notnull의 예입니다.
1. 유효성 검사 주석 정의, Field ()가 기본 주석과 비교하여 추가되며, 검증 된 제출 된 이름을 전달하는 데 사용됩니다.
notnull.java
@TARGET ({ElementType.Method, ElementType.field, ElementType.annotation_type, elementType.constructor, elementType.parameter})@constraint (validatedby = {notnullValidator.class})@retention (retentionpolicy.runtime)@interface nontnull {strault am ""; 문자열 message () default "{field.can.not.be.null}"; class <?> [] groups () default {}; 클래스 <? Payload를 확장합니다> [] payload () default {};} 2. 유효성 검사기 정의, 모든 유효성 검사기는 구속 조건 Validator 인터페이스를 구현합니다.
notnullvalidator.java
공개 클래스 NOTNULLVALIDATOR <notnull, object> {@override public void initialize (notnull annotation) {} @override public boolean isvalid (Object str, supstaintValidatorContext QustaintValidatorContext) {return str! = null; }} 3. 유효성 검사 주석을 추가하여 제출 된 값을 지정하는 데주의를 기울이십시오. 메시지에 개인화 된 요구 사항이없는 경우 지정할 필요가 없습니다. 유효성 검사 구성 요소는 기본 메시지 자체를 채우게됩니다.
BuyflowerRequest.java
@setter @getterpublic class buyflowerrequest {@notempty (field = "bianname") 개인 문자열 이름; @min (field = "price", value = 1) 개인 int 가격;} 참고 : @NotNull 주석은 이미 목록의 특수 검증을 지원합니다. 목록 유형 노드의 경우 list == null ||입니다 list.size () == 0은 false를 반환하고 검증이 실패합니다. 현재 @notnull, @notempty, @min, @max 주석은이 아이디어에 따라 사용자 정의되었으며 상품 프로젝트에서 찾을 수 있습니다.
지원 요청을 지원합니다
위의 예는 모두 후 요청입니다. @RequestBody는 게시물 요청을 해결할 수 있지만 GET 요청을 지원하지 않습니다. Spring의 문서 및 소스 코드를 읽고 @ModelAttribute가 BEAN에 요청을 해결하고 유효성 검사를 지원할 수 있음을 발견했습니다. 자세한 내용은 Spring 소스 코드 : ModelAttributeMethodProcessor.resolVeargument () 메소드를 읽을 수 있습니다.
사용의 예 :
@RequestMapping (value = "/buy", method = requestmethod.get) @ResponseBodyPublic BaseResponse 세부 사항 (@valid @ModelAttribute detailflowerRequest 요청) 예외 {reductflowerResponse 응답 = new detailFlowerResponse (); response.setName (request.getName ()); return resultfactory.success (응답, baseresponse.class);} TODO
1. 날짜 형식, 금액 등과 같은 비즈니스 시나리오에 따라 유효성 검사 확장.
2. 다중 현장 관계 검증의 지원 검증
첨부 : 스프링 유효성 검사 구현 키 코드
@requestbody
구현 클래스 : RequestresponseBodyMethodProcessor.java
공개 객체 ResolVeargument (MethodParameter 매개 변수, ModelAndViewContainer MavContainer, NativeWebRequest WebRequest, WebDatabinderFactory BinderFactory) 예외 {Object Arg = this.ReadWithMessAgeConverters (WebRequest, Parameter, Parameter.GetEricparameterPe ()); 문자열 이름 = concentions.getVariableNameforParameter (매개 변수); WebDatabinder binder = bindfactory.createbinder (WebRequest, arg, name); if (arg! = null) {this.validateifapplicable (바인더, 매개 변수); if (binder.getBindingResult (). hasErrors () && this.isbindexceptionRequired (binder, parameter)) {새 methodArgumentNotValidexception (매개 변수, binder.getBindingResult ()); }} mavcontainer.addattribute (bindingResult.model_key_prefix + 이름, binder.getBindingResult ()); arg;} 반환 @modelattuite
구현 클래스 : ModelAttributeMethodProcessor.java
공개 최종 객체 ResolVeargument (MethodParameter 매개 변수, ModelAndViewContainer MavContainer, NativeWebRequest WebRequest, WebDatabinderFactory BinderFactory) 예외 {String Name = ModelFactory.getNameforParameter (매개 변수); 개체 속성 = mavcontainer.containsAttribute (이름)? mavcontainer.getModel (). get (name) : this.createAttribute (이름, 매개 변수, bindFactory, webRequest); if (! mavcontainer.isbindingDisabled (name)) {modelattribute ann = (modelAttribute) parameter.getParameterAnnotation (modelAttribute.class); if (ann! = null &&! ann.binding ()) {mavcontainer.setBindingDisabled (name); }} webDatabinder binder = bindfactory.createbinder (webRequest, 속성, 이름); if (binder.getTarget ()! = null) {if (! mavcontainer.isbindingDisabled (name)) {this.bindRequestParameters (binder, webRequest); } this.validateifpplicable (바인더, 매개 변수); if (binder.getBindingResult (). hasErrors () && this.isbindexceptionRequired (binder, parameter)) {wrach new bindException (binder.getBindingResult ()); }} map <string, 객체> bindingResultModel = binder.getBindingResult (). getModel (); mavcontainer.removeattributes (bindingResultModel); mavcontainer.addallattributes (BindingResultModel); return binder.convertifnecessary (binder.gettarget (), parameter.getParameterType (), 매개 변수);}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.