이 기사는 스프링 부팅과 JDK8을 기반으로 AOP 작성을 소개하여 사용자 정의 주석을 결합하여 일반적인 인터페이스 매개 변수 검증을 달성합니다.
이유
현재 일반적으로 사용되는 매개 변수 검증 방법은 엔티티 클래스에 주석을 추가하는 것이지만 다른 방법의 경우 적용된 검증 규칙도 다릅니다. 예를 들어, AccountVo 엔티티가 있습니다.
공개 클래스 AccountVo {개인 문자열 이름; // 개인 정수 시대 이름; // 나이}비즈니스가 있다고 가정합니다. 사용자가 등록 할 때 자신의 이름을 채워야하며 사용자가 로그인하면 자신의 이름 만 채워야합니다. 그런 다음 엔티티 클래스에 검증 규칙을 추가하는 것은 분명히 부적절합니다.
따라서 항상 메소드 레벨 파라미터 검증을 구현하고 싶었습니다. 다른 방법은 동일한 엔티티 매개 변수에 대해 다른 검증 규칙을 적용 할 수 있으며,이 도구를 낳았으며 매일 작업에 오랫동안 사용되었습니다.
소개하다
먼저 사용하는 방법을 살펴 보겠습니다.
@ServicePublic Class Testimpl은 ItestService {@override @check ({ "name", "age"}) public void testValid (AccountVo vo) {// ...}}를 구현합니다.이 메소드의 @check 주석은 매개 변수 AccountVo의 이름과 연령 속성이 비어질 수 없음을 나타냅니다. 비어 있지 않은 검증 외에도 크기 판단 및 평등 검증도 지원합니다.
@check ({ "id> = 8", "name! = aaa", "title <10"}))기본 오류 메시지는 필드, 오류 원인 및 다음과 같은 호출 된 메소드를 반환합니다.
testValidName을 호출하는 동안 testValidName을 호출하는 동안 testValidName을 호출하는 동안 updateUserId는 null을 사용하지 않아야합니다! = aaa testValid를 호출합니다.
사용자 정의 오류 반환 정보도 지원됩니다.
@check ({ "title <= 8 : 구두점"을 포함하여 제목 문자 수는 8 자를 초과하지 않습니다.추가 : 확인 규칙 후에는 기본 오류 메시지를 대체하는 사용자 정의 정보를 작성하십시오.
추신 : 핵심 원칙은 반사를 통해 매개 변수 엔티티의 필드 값을 얻은 다음 규칙에 따라 확인하는 것입니다. 따라서 현재 하나의 매개 변수를 포함하는 메소드 만 지원되며 매개 변수는 기본 유형 일 수 없습니다.
사용
스프링 부츠에서 AOP를 사용하는 방법은 여기에서 자세히 설명하지 않으며 주로 AOP에 핵심 코드를 소개합니다.
Maven 의존성
스프링 부츠 종속성 외에도 필요한 타사 종속성은 핵심 종속성이 아니며 개인 습관에 따라 선택할 수 있습니다.
문자열 검증-> <pectinement> <groupid> org.apache.commons </groupid> <artifactid> commons-lang3 </artifactid> <3.2 </version> </fextionency> <!-로그 인쇄-> <pection> <groupid> org.slf4j </groupid> slf4J--api> <버전> 1.7.25 </버전> </의존성>
맞춤형 주석
import java.lang.annotation.elementtype; import java.lang.annotation.retention; import java.lang.annotation.target; import static java.lang.annotation.retentionpolicy.runtime;/*** 매개 변수 검증 주석* 2017/9/20. */@target ({elementType.type, elementType.Method})@retention (runtime) public @Interface check {// 필드 확인 규칙, 형식 : 필드 이름 + 확인 규칙 + 콜론 + 오류 메시지 : id <10 : id는 10 문자열 [] value ();}이어야합니다.핵심 코드
@check 주석으로 인터페이스 메소드를 가로 채면 메소드가 실행되기 전에 매개 변수 검증을 수행하십시오. 오류 메시지가 있으면 직접 반환됩니다.
@Around (value = "@com.cipher.checker.check") // 여기에서 사용자 정의 주석 경로로 변경해야합니다. 공개 객체 확인 (ProceedingJoinPoint Point) 던지기 가능 {Object obj; // 매개 변수 확인 문자열 msg = docheck (point); if (! stringUtils.isempty (msg)) {// 여기에서 캡슐화 된 반환 클래스를 반환 할 수 있습니다. } obj = point.proceed (); return obj;}Docheck 방법의 핵심 검증 방법, 주요 원칙은 주석에 지정된 필드 이름 및 검증 규칙을 얻고, 반사를 통해 매개 변수 엔티티에서 해당 필드의 값을 얻은 다음 검증을 수행하는 것입니다.
/*** 매개 변수 검증** @Param Point ProceedingJoinPoint* @return 오류 메시지*/private String docheck (praceingingjoinpoint point) {// 메소드 매개 변수 값 객체 [] arguments = point.getArgs (); // 메소드 메소드 get method = getMethod (point); String MethodInfo = StringUtils.isempty (method.getName ())? "": "호출 중" + method.getName (); 문자열 msg = ""; if (ischeck (method, arguments)) {check annotation = method.getAnnotation (check.class); 문자열 [] fields = annotation.value (); 대상 VO = 인수 [0]; if (vo == null) {msg = "param은 null이 될 수 없습니다"; } else {for (문자열 필드 : 필드) {// Parsing FieldInfo info = Resolvefield (Field, MethodInfo); // 필드 객체의 값을 가져옵니다 값 value = reclectionUtil.invokeGetter (vo, info.field); // 검증 규칙 실행 boolean isvalid = info.optenum.fun.apply (value, info.operatornum); msg = isvalid? MSG : info.innermsg; }}} return msg;}주요 논리는 다음과 같습니다.
Parse Fields-> 필드 값 받기 -> 검증 규칙 실행
열거 클래스는 내부적으로 유지되며 관련 검증 작업은 다음과 같습니다.
/** * Operation enum */enum 연산자 {/** *보다 큰 */greater_than ( ">", CheckParamaspect :: isgreaterthan),/** *보다 크거나 동일하거나 */great_than_equal ( "> =", CheckParamaspect :: isgreaterthanequal) / **** / less_than_equal ( "<=", checkparamaspect :: islessthanequal), / ***와 동일합니다* / not_equal ( "! =", checkparamaspect :: isnotequal), / *** not empty* / not_null ( "Not NULL", CheckParamasppect :: isotnull); 개인 문자열 값; 비공개 이중 공학 <개체, 문자열, 부울> 재미; 연산자 (문자열 값, bifunction <객체, 문자열, 부울> 재미) {this.value = value; this.fun = 재미; }} 공간적인 이유로 인해 모든 코드를 하나씩 확장하지는 않습니다. 관심있는 친구들은 다음 주소로 모든 소스 코드를 얻을 수 있습니다. ciphermagic/java-learn/sandbox/checker
TODO
마침내
읽어 주셔서 감사합니다. 그것을 좋아하는 친구들은 Github에서 그것을 좋아할 수 있습니다. 질문이나 제안이 있으시면 아래 메시지를 남겨두고 답장을 기대하십시오.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.