Spring boot 通过AOP获取参数名称及参数值并对参数进行校验

/**
 * 定义切入点为 带有 NotEnableEmpty 注解的 
 */
@Pointcut("@annotation(cn.acsm.paddy.manage.anotation.NotEnableEmpty)")
public void params() {
}

/**
 * 定义环绕通知
 * @param joinPoint
 * @throws ClassNotFoundException
 * @throws NotFoundException
 * @throws IOException
 */
@Around("params()")
public void doBefore(ProceedingJoinPoint joinPoint) throws ClassNotFoundException, NotFoundException, IOException {
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attributes.getRequest();
    HttpServletResponse response = attributes.getResponse();
    String classType = joinPoint.getTarget().getClass().getName();
    Class<?> clazz = Class.forName(classType);
    String clazzName = clazz.getName();
    String methodName = joinPoint.getSignature().getName(); //获取方法名称
    Object[] args = joinPoint.getArgs();//参数
    Map<String, Object> nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName, args);//获取被切参数名称及参数值
    System.out.println(nameAndArgs.toString());
    List<Object> requestParams = RequestParamsContextHolder.getRequestParamsLocal();//获取不能为空的参数
    RpcResponseEntity rpcResponseEntity = new RpcResponseEntity();
    boolean hasEmptyParams = false;
    for (Object o : requestParams) {
        if (nameAndArgs.containsKey(o)) {
            Object o1 = nameAndArgs.get(o);
            if (o1 == null) {
                rpcResponseEntity.setInvoke_result_code(RpcResponseEnum.LACK_NECESSARY_PARAMS.getCode());
                rpcResponseEntity.setInvoke_result_message(RpcResponseEnum.LACK_NECESSARY_PARAMS.getMessage());
                hasEmptyParams = true;
                break;
            }
        }
    }
    if (hasEmptyParams) {
        response.reset();
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Type", "text/plain;charset=UTF-8");
        response.setHeader("icop-content-type", "exception");
        OutputStream stream = response.getOutputStream();
        net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(rpcResponseEntity);
        stream.write(jsonObject.toString().getBytes("UTF-8"));
    }
    //获取参数名称和值
    logger.info("当前调用接口-[" + request.getRequestURL() + "]");
}

/**
 * 通过反射机制 获取被切参数名以及参数值
 *
 * @param cls
 * @param clazzName
 * @param methodName
 * @param args
 * @return
 * @throws NotFoundException
 */
private Map<String, Object> getFieldsName(Class cls, String clazzName, String methodName, Object[] args) throws NotFoundException {
    Map<String, Object> map = new HashMap<String, Object>();

    ClassPool pool = ClassPool.getDefault();
    //ClassClassPath classPath = new ClassClassPath(this.getClass());
    ClassClassPath classPath = new ClassClassPath(cls);
    pool.insertClassPath(classPath);

    CtClass cc = pool.get(clazzName);
    CtMethod cm = cc.getDeclaredMethod(methodName);
    MethodInfo methodInfo = cm.getMethodInfo();
    CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
    LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
    if (attr == null) {
        // exception
    }
    // String[] paramNames = new String[cm.getParameterTypes().length];
    int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
    for (int i = 0; i < cm.getParameterTypes().length; i++) {
        map.put(attr.variableName(i + pos), args[i]);//paramNames即参数名
    }
    return map;
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值