RequestAspect


package com.hina.cloud.service.common.aspect;

import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.lang.reflect.Method;
import java.time.Duration;
import java.time.Instant;

@Slf4j
@Aspect
@Configuration(proxyBeanMethods = false)
public class RequestAspect {

    @Autowired
    private ObjectMapper objectMapper;

    @Pointcut("@annotation(io.swagger.annotations.ApiOperation)")
    private void apiOperation() {
    }

    /**
     * 入参打印
     */
    @Before("apiOperation()")
    public void doBefore(JoinPoint point) throws Throwable {
        String methodDescription = getApiOperationValue(point);
        for (Object arg : point.getArgs()) {
            if (arg instanceof ServletRequest || arg instanceof MultipartFile[] || arg instanceof MultipartFile || arg instanceof ServletResponse) {
                continue;
            }
            log.info("【{}】入参:{}{}", methodDescription, System.getProperty("line.separator"), objectMapper.writeValueAsString(arg));
        }
    }

    /**
     * 耗时
     *
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around("apiOperation()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Instant startTime = Instant.now();
        Object result = proceedingJoinPoint.proceed();
        log.info("执行耗时:{}毫秒", Duration.between(startTime, Instant.now()).toMillis());
        return result;
    }

    /**
     * 获取swagger 描述信息
     *
     * @param joinPoint 切点
     * @return 描述信息
     * @throws Exception
     */
    public String getApiOperationValue(JoinPoint joinPoint) throws Exception {
        String targetName = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        Object[] arguments = joinPoint.getArgs();
        Class targetClass = Class.forName(targetName);
        Method[] methods = targetClass.getMethods();
        StringBuilder description = new StringBuilder();
        for (Method method : methods) {
            if (method.getName().equals(methodName)) {
                Class[] clazzs = method.getParameterTypes();
                if (clazzs.length == arguments.length) {
                    description.append(method.getAnnotation(Operation.class).summary());
                    break;
                }
            }
        }
        return description.toString();
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值