하나의 주해 로 전역 매개 변수 검사 완료

6344 단어 자바
1. maven 의존 도입

		
			org.springframework.boot
			spring-boot-starter-web
		

		
			org.projectlombok
			lombok
		

		
			com.alibaba
			fastjson
			1.2.58
		

		
			org.springframework.boot
			spring-boot-starter-aop
		

		
			org.apache.commons
			commons-lang3
			${commons-lang3.version}
		

		
			commons-beanutils
			commons-beanutils
			1.9.3
		

	

2. 사용자 정의 매개 변수 검사 주석 과 이상
/**
 * @Author: guandezhi
 * @Date: 2019/12/17 16:55
 */
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ParamValidate {
}
/**
 * @Author: guandezhi
 * @Date: 2019/12/17 17:13
 */
public class ParamValidateException extends RuntimeException {

    public ParamValidateException(String errorMsg) {
        super(errorMsg);
    }

    public ParamValidateException(String errorMsg, Throwable e) {
        super(errorMsg, e);
    }
}

3. 매개 변수 검사 절단면 정의
/**
 *       
 *
 * @Author: guandezhi
 * @Date: 2019/12/17 15:07
 */
@Slf4j
@Aspect
@Component
public class ParamValidateAspect {

    @Resource
    private LocalValidatorFactoryBean localValidatorFactoryBean;

    /**
     *   controller            ParamValidate   
     */
    @Pointcut("execution(public * com.gdz.demo.controller.*." +
            "*(@com.gdz.demo.annotation.ParamValidate (*),..)) ||" +
            " execution(public * com.gdz.demo.controller.*." +
            "*(..,@com.gdz.demo.annotation.ParamValidate (*)))")

    public void webLog() {
    }

    @Before("webLog()")
    public void before(JoinPoint joinPoint) throws Exception {
        doBefore(joinPoint);
    }

    /**
     *     
     *
     * @param joinPoint
     */
    private void doBefore(JoinPoint joinPoint) {
        Object paramValue = getMethodParamValue(joinPoint);
        if (paramValue != null) {
            Set> validErrors = this.localValidatorFactoryBean.validate(paramValue, new Class[]{Default.class});
            Iterator iterator = validErrors.iterator();
            StringBuilder errorMsg = new StringBuilder();

            while (iterator.hasNext()) {
                ConstraintViolation constraintViolation = (ConstraintViolation) iterator.next();
                String error = constraintViolation.getPropertyPath() + ":" + constraintViolation.getMessage();
                errorMsg.append(iterator.hasNext() ? error + "; " : error);
            }
            if (!validErrors.isEmpty()) {
                throw new ParamValidateException(errorMsg.toString());
            }
        }
    }


    /**
     *                  
     *
     * @param joinPoint
     * @return
     */
    private Object getMethodParamValue(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        /*  @ParamValidate  */
        Annotation[][] parameterAnnotations = signature.getMethod().getParameterAnnotations();
        if (parameterAnnotations != null) {
            for (Annotation[] parameterAnnotation : parameterAnnotations) {
                int paramIndex = ArrayUtils.indexOf(parameterAnnotations, parameterAnnotation);
                for (Annotation annotation : parameterAnnotation) {
                    if (annotation != null && annotation instanceof ParamValidate) {
                        return args[paramIndex];
                    }
                }
            }
        }
        return null;
    }
}

4. 전역 캡 처 매개 변수 가 이상 을 검사 하고 원 하 는 형식 으로 되 돌려 줍 니 다.
/**
 * @Author: guandezhi
 * @Date: 2019/12/17 16:53
 */
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {


    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public ResultVo handleException(Exception e) {
        String errorMsg = "";
        ResultVo resultVo = new ResultVo<>();

        if (e instanceof NullPointerException) {
            errorMsg = "       ";
            resultVo.setResultCode(HttpCode.FAIL.getMsgCode());
        } else if (e instanceof ParamValidateException) {
            errorMsg = "        ," + e.getLocalizedMessage();
            resultVo.setResultCode(HttpCode.ILLEGAL_INPUT.getMsgCode());
        } else {
            errorMsg = e.getMessage();
            resultVo.setResultCode(HttpCode.ERROR.getMsgCode());
            log.error("    :", e);
        }
        resultVo.setResultMsg(errorMsg);
        return resultVo;
    }
}

5. 테스트 해 보기: 검사 가 필요 한 매개 변수 옆 에 @ ParamValidate 만 추가 하면 됩 니 다.
/**
 * @Author: guandezhi
 * @Date: 2020/1/17 15:04
 */
@Slf4j
@RestController
public class IndexController {

    @PostMapping("/index")
    public String test(@RequestBody @ParamValidate User user) {
        return "success";
    }
}

그 중에서 사용자 실 체 는 다음 과 같다.
/**
 * @Author: guandezhi
 * @Date: 2020/1/17 15:05
 */
@Data
public class User {

    @NotNull(message = "       ")
    private String userName;

    @NotBlank
    private String city;

    @Min(value = 1, message = "         1")
    @Max(value = 99, message = "         99")
    private int age;

    @Size(min = 1, max = 3, message = "      1 ,  3 ")
    private List alias;
}

테스트 결 과 는 다음 과 같다.
{
  "resultCode": 401,
  "resultMsg": "        ,alias:      1 ,  3 ; age:         99; userName:       ",
  "data": null
}

코드 주소:https://github.com/dezhiguan/paramvalidate.git

좋은 웹페이지 즐겨찾기