왜:
왜 AOP를 사용하여 확인을 달성합니까?
답변:
Spring MVC에는 자체 검증 메커니즘 @Valid + BindingResult가 있지만이 기본 구현은 컨트롤러 메소드에서 BindingResult를 수신하여 확인을 수행해야합니다.
예 : :
if (result.haserrors ()) {list <sjecterror> allerrors = result.getallerrors (); <string> errorlists = new ArrayList <> (); for (objecterror objecterror : allerrors) {errorlists.add (objecterror.getDefaultMessage ()); }}오류 명단을 얻습니다. 이것이 구현되면, 검증이 필요한 각 방법은 캡슐화 된 경우에도 반복적으로 호출되어야합니다.
위의 진술은 Spring의 @Valid + BindingResult의 구현을 표시 할 수 없습니다. "밤나무"를 드리겠습니다.
1. 밤나무 (오래된 버전)
1.1 인터페이스 레이어 (idal)
예 : 간단한 사후 요청, @requestbody 요청 데이터를 수신, @valid + bindingResult 확인을 수행합니다.
@ResponseBody @postmapping ( "body") public responsevo bodypost (@requestbody @valid testvo body, bindingResult result) {// check error if (result.haserrors ()) {list <objecterror> allerrors = result.getallerrors (); List <string> lists = new ArrayList <> (); for (objecterror objecterror : allerrors) {lists.add (objecterror.getDefaultMessage ()); } return new responsevo (httpstatus.bad_request.value (), "매개 변수 빈", 목록); } return new responsevo (httpstatus.ok.value (), "bodypost", null);}1.2 엔티티 (VO) 확인 컨텐츠
@Valid + BindingResult는 많은 검증 주석이 있으며 온라인으로 터치하자마자 찾을 수 있습니다!
public class testVo {@getter @setter @min (value = 0, message = "요청 매개 변수 Isstring이 0보다 작을 수 없습니다") 개인 정수 ISINT; @getter @setter @notblank (message = "요청 매개 변수 Isstring이 비어있을 수 없음") 개인 문자열 isstring;}1.3 결과 테스트
2. AOP 확인 (업그레이드 된 버전)
BodyPost처럼 여러 바디를 점검 해야하는 경우 코드 조각을 지속적으로 재생해야합니다. 부모 클래스 재사용 방법으로 변경 되더라도 호출해야합니다. 그래서 나는 그것에 대해 생각 한 후에도 우아하지 않다고 느낍니다. 따라서 섹션 확인을위한 AOP가 있습니다.
2.1 인터페이스 레이어 (IDAL)
예! 당신은 그 말을 올바르게 읽으십시오. 위의 코드는 사라졌으며 부모 클래스의 공유 방법을 호출 할 필요가 없습니다. 하나의 주석 만 수행됩니다 : @paramvalid
@paramvalid@responsebody@postmapping ( "body") public responsevo bodypost (@requestbody @valid testvo body, bindingResult result) {return new responsevo ( "bodypost", null);}2.2 사용자 정의 주석
이 주석은 또한 간단한 방법 주석입니다.
@TARGET (ElementType.Method) @retention (retentionpolicy.runtime) public @interface paramvalid {}2.3 핵심 포인트! 측면 구현
섹션에 대한 자세한 설명 :
@Before : 주석 메소드 @Annotation (XX)을 사용하면 원하는 주석 (@ParamValid)을 사용할 때 마다이 방법이 호출됩니다.
JoinPoint : BindingResult로 확인 된 내용을 얻으려면 JoinPoint를 통해 메소드의 매개 변수를 가져옵니다.
검증 패키지 마이그레이션 : 원래 검증을 측면으로 마이그레이션합니다 : ValidRequestParams
응답 검증 결과 :
@Aspect@ComponentPublic Class ParamvalidAspect {private static final logger log = loggerfactory.getLogger (paramvalidaspect.class); @before ( "@annotation (paramvalid)") public void paramvalid (joinpoint point, paramvalid paramvalid) {object [] paramobj = point.getargs (); if (paramobj.length> 0) {if (paramobj [1] bindingResult의 인스턴스) {bindingResult result = (bindingResult) paramobj [1]; responsevo errormap = this.validRequestParams (결과); if (errormap! = null) {servletrequestattributes res = (servletrequestattributes) requestContexTholder.getRequestAttributes (); httpservletResponse 응답 = res.getResponse (); 응답 .SetchAracterEncoding ( "UTF-8"); response.setContentType (mediaType.Application_json_utf8_value); Response.setStatus (httpstatus.bad_request.value ()); 출력 스트림 출력 = NULL; try {output = response.getOutputStream (); errormap.setCode (null); 문자열 error = new gson (). tojson (errormap); log.info ( "AOP 매개 변수 불규칙 감지" + 오류); output.write (error.getBytes ( "UTF-8")); } catch (ioexception e) {log.error (e.getMessage ()); } 마침내 {try {if (output! = null) {output.close (); }} catch (ioexception e) {log.error (e.getMessage ()); }}}}}}}}} / *** verification* / private responsevo validRequestParams (bindingResult result) {if (result.haserrors ()) {list <ScterRor> allerRors = result.getArlerRors (); List <string> lists = new ArrayList <> (); for (objecterror objecterror : allerrors) {lists.add (objecterror.getDefaultMessage ()); } return new responsevo (httpstatus.bad_request.value (), "매개 변수 빈", 목록); } return null; }}2.4 테스트 결과
위의 두 가지 결과를 읽은 후에는 Spring AOP를 @Valid + BindingResult와 함께 사용하는 장점을 검증을 위해 비교할 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.