소개
SpringMVC를 웹 개발을위한 컨트롤러 계층으로 사용하는 경우 컨트롤러에서 메소드에 대한 매개 변수 검사를 수행해야합니다. 원래 SpringMVC에는 매개 변수를 확인하는 데 사용할 수있는 @Valid @Valid 및 @Validated 주석이 두 개가 있지만 매개 변수가 Bean 일 때만 확인할 수 있습니다. 문자열 또는 긴 사람에게는 적용 할 수 없습니다. 때때로이 두 주석이 갑자기 실패합니다 (그 이유는 신중하게 조사되지 않았습니다). 이와 관련하여 Spring의 AOP 및 사용자 정의 주석을 사용하여 매개 변수 검증 기능을 직접 작성할 수 있습니다.
코드 예제
참고 :이 섹션의 코드는 단지 데모 일 뿐이며, 완전한 솔루션이 아니라 실현 가능한 아이디어를 제공합니다.
이 프로젝트는 간단한 웹 프로젝트로 사용됩니다 : Spring, SpringMVC, Maven, JDK1.8
프로젝트 구조 :
사용자 정의 주석 :
ValidParam.java :
package com.lzumetal.ss.ss.s.paramcheck.annotation; import java.lang.annotation.*;/***매개 변수에 주석이 붙어 있습니다. 매개 변수를 확인해야 함을 나타냅니다.
notnull.java :
com.lzumetal.ss.s.sparamcheck.annotation; import java.lang.annotation.*;@target ({elementtype.field, elementtype.parameter})@retention (retentionpolicy.runtime)@documentedpublic @interface notnull {default "파일이 공허 할 수 없다"; }notempty.java :
package com.lzumetal.ss.s.s.sparamcheck.annotation; import java.lang.annotation.*;@target ({elementtype.field, elementtype.parameter})@retention (retentionpolicy.runtime)@documentedpublic @interface {string msg () "기본값"파일이 공허 할 수 없다 "; } 얼굴 절단
paramcheckaspect.java :
package com.lzumetal.ss.s.sparamcheck.aspect; import com.lzumetal.ss.s.sparamcheck.annotation.notempty; import com.lzumetal.ss.s.paramcheck.annotation.notnull; import com.lzumetal.ss.s.sparamcheck.annotation.validparam; import org.apache.commons.lang3.stringutils; import org.aspectj.lang.joinpoint; import org.aspectj.lang.annotation.aspect; import org.aspectj.lang.annotation.be -org.aspectj.lang.reflect.methodsignature; import org.spramwork.sterepoty.component; Javax.servlet.http.http.httpservletrequest; import javax.servlet.http.htttp.httpservletresponse; import javax.servlet.http.htttp.htttp.httpletresponse; import javax.servlet.http.httpession; import java.lang.reffct.fild java.lang.reflect.parameter; import java.util.arrays;/***매개 변수 검사 패싯 클래스*/@aggine@componentpublic class@empoblic class paramcheckaspect {@before ( "execution (*com.lzumetal.ssssssssm.poramcheck.controller.*(...))") ") Object [] args = joinpoint.getargs (); // 메소드 매개 변수 가져 오기 메소드 서명 서명 = (MethodSignature) joinpoint.getSignature (); 매개 변수 [] 매개 변수 = signature.getMethod (). getParameters (); for (int i = 0; i <parameters.length; i ++) {파라미터 매개 변수 = 매개 변수 [i]; // Java의 자체 기본 유형의 매개 변수 (예 : 정수, 문자열)는 (isprimite (parameter.gettype ())) {notnull notnull = parameter.getAnnotation (notnull.class); if (notnull! = null && args [i] == null) {throw new runtimeexception (parameter.toString () + notnull.msg ()); } // TODO 계속; } /** @ValidParam 주석이 표시되지 않거나 httpservletrequest, httpservletreponse 또는 httpsession이 완료되지 않은 경우 처리가 수행되지 않습니다. parameter.getType (). IsAssignableFrom (httpsession.class) || } class <?> paramclazz = parameter.getType (); // 유형에 해당하는 매개 변수 개체를 가져옵니다. 실제 프로젝트의 컨트롤러의 인터페이스는 동일한 사용자 정의 유형의 두 매개 변수를 전달하지 않으므로 여기에서 바로 findfirst ()를 사용하십시오. Object Arg = arrays.stream (args) .filter (ar-> paramclazz.isassignablefrom (ar.getClass ()). findFirst (). get (); // 매개 변수 필드의 모든 멤버 변수를 가져옵니다. for (필드 필드 : deLlearedfields) {field.setAccessible (true); // @notnull notnull = field.getAntantation (notnull.class)으로 표시된 필드를 확인합니다. if (notnull! = null) {Object FieldValue = field.get (arg); if (fieldValue == NULL) {wrach new runtimeexception (field.getName () + notnull.msg ()); }} // @notempty annotation으로 표시된 필드를 확인하십시오. Notempty는 문자열 유형에만 사용됩니다. if (notempty! = null) {if (! string.class.isAssignableFrom (field.getType ())) {throw new runtimeexception ( "잘못된 필드 클래스에서 사용하지 않는 주석"); } 문자열 fieldstr = (string) field.get (arg); if (stringUtils.isblank (fieldstr)) {wrach new runtimeexception (field.getname () + notempty.msg ()); }}}}}} /** * 기본 유형인지 결정 : 문자열 포함 * @param clazz clazz * @return true : 예; False : NOT */ Private Boolean isprimite (class <?> clazz) {return clazz.isprimitive () || Clazz == String.class; }} 매개 변수 Javabean
StudentParam.java :
PACKED COM.LZUMETAL.SS.S.PARAMCHECK.REQUESTPARAM; import com.lzumetal.ss.sss.sparamcheck.annotation.notempty; import com.lzumetal.ss.ss.sparamcheck.annotation.notnull; public studentparam {@notnull private inger id; 개인 정수 시대; @notempty 개인 문자열 이름; // 얻기, 생략 된 메소드 설정 ...} 파라미터 검증 검증을위한 컨트롤러
TestController.java :
패키지 com.lzumetal.ss.ss.sparamcheck.controller; import com.google.gson.gson; import com.lzumetal.ss.ss.ss.ss.ss.ss.ss.ss.ss.ssssss.sm.paramcheck.annotation.validparam; import com.lzumetal.ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss.sparamcheck org.springframework.stereotyp.controller; import org.springframework.web.bind.annotation.requestmapping; import org.spramframework.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.rsponse {@controllic reconder {@controllic reconder {rupeastmapping.requestmethod; 정적 GSON GSON = NEW GSON (); @ResponseBody @RequestMapping (value = "/test", method = requestmethod.post) public studentparam checkparam (@validparam studentparam param, @notnull 정수 한계) {system.out.println (gson.tojson (param)); System.out.println (한계); 반환 매개 변수; }} 이 섹션의 샘플 코드는 github : https://github.com/liaosilzu2007/ssm-parent.git에 업로드되었습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.