Spring Aop | 通过 @Aspect 实现日志切面,记录接口的请求体参数,返回参数


不熟悉Aop的可以先去看看这篇基础文章
https://blog.csdn.net/qq_41437542/article/details/111319232


废话不多说,直接开始上代码,不懂的评论区留言讨论。

0.先添加一下aop依赖

        <dependency>
            <groupId>org.aspectjgroupId>
            <artifactId>aspectjweaverartifactId>
            <version>1.9.6version>
        dependency>

1. 创建一个实体,作为接口的参数(返回也用这个,懒得再弄个)

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TestQueryDTO {
    
    private String uuid;

    private String name;

    private String phone;
}

2. 创建一个接口,为方便区分记录,改一下请求体参数再返回

@RequestMapping("/test")
@RestController
public class testController {
    @PostMapping("/addHistory")
    public TestQueryDTO addHistory(@RequestBody TestQueryDTO query) {
        query.setName("test修改");
        query.setPhone("testPhone");
        query.setUuid("test422c5b144b334a7c97ad8076");
        return query;
    }
}

3. 创建aop切面,需要实现的操作class

@Aspect
@Configuration
@Slf4j
public class testAop {

    @Pointcut("execution(public * com.myRobot.testController.addHistory(..))")
    public void operationLog() {
        log.info("日志切面开始");
    }

    @Before("operationLog()")
    public void doOperationLogBefore(JoinPoint joinPoint) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes == null) {
            return;
        }
        //参数
        Object[] args = joinPoint.getArgs();
        JSONObject argJson = JSONObject.parseObject(JSON.toJSONString(args[0]));
        log.info("接口请求参数,{}", argJson.toJSONString());
    }


    @AfterReturning(
            pointcut = "operationLog()",
            returning = "returnDto")
    public void doOperationLogAfter(Object returnDto) {
        TestQueryDTO returnData = (TestQueryDTO) returnDto;
        log.info("接口返回参数,{}", returnData);
    }
}

上方例子中,@Before 是在接口访问前会进行的操作,这里我们通过这个注解,可以拿到请求体,具体看例子的代码。
@AfterReturning则是拿到接口返回的参数,注意需要在注解后添加 returning = "returnDto" 这里的val 需要和方法的参数名称一致。


结果测试:接口可以正常响应

Spring Aop | 通过 @Aspect 实现日志切面,记录接口的请求体参数,返回参数_第1张图片

参数也可以正常拿到

在这里插入图片描述

你可能感兴趣的:(Java,ee,spring,java,后端)