Spring Aop | 通过 @Aspect 实现日志切面,记录接口的请求体参数,返回参数
不熟悉Aop的可以先去看看这篇基础文章
https://blog.csdn.net/qq_41437542/article/details/111319232
废话不多说,直接开始上代码,不懂的评论区留言讨论。
0.先添加一下aop依赖
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></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 需要和方法的参数名称一致。