Spring Controller 打印入参/出参

参考

思路:

自定义注解,针对注解创建切面,对Controller 中的方法使用注解,通过切面中的 @Before, @Around 获取数据并打印

实现步骤

完整代码地址:https://gitee.com/springff/logprint

日志打印 pom.xml 依赖

<!-- spring-aop -->
<spring.version>4.3.12.RELEASE</spring.version>
<!-- jackson-databind, jackson-core, jackson-annotations -->
<jackson.version>2.9.1</jackson.version>
<!-- aspectjrt, aspectjweaver 实现切面 -->
<aspectj.version>1.8.9</aspectj.version>
<!-- logback-core 会自动引入依赖的 sjf4j -->
<logback.version>1.2.2</logback.version>
<!-- lombok sjf4j 中 log 对象实例化-->
<lombok.version>1.16.18</lombok.version>

spring-mvc.xml 添加 aop 自动代理 <aop:aspectj-autoproxy/>

新建注解 LogPrint,将注解作为切点,作用到 Controller 的方法

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogPrint {
    String description() default "";
}

新建切面 LogPrintAspect,在 controller 方法调用前,调用后打印入参,出参

@Aspect
@Component
@Slf4j
public class LogPrintAspect {
    // 1,声明切点
    @Pointcut("@annotation(cn.exrick.common.annotaion.LogPrint)")
    public void logPrint(){}
    // 2,打印入参 joinPoint.getArgs() -- 获取入参
    @Before("logPrint()")
    public void doBefore(JoinPoint joinPoint){
    // 3, 打印出参 proceedingJoinPoint.proceeding() -- 执行切点修饰的方法,拿到结果,打印响应
    @Around("logPrint()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {}
	// 4,切点作用的方法结束
    @After("logPrint()")
    public void doAfter(){}
}

使用注解 @LogPrint 修饰 Controller 类中的方法

@RestController
public class LogController {
    @LogPrint
    @RequestMapping("/logGet")
    public Object getTest(String name, String age){
        String content = name + "今年" + age + "岁";
        HashMap<String, Object> resultMap = new HashMap<>();
        resultMap.put("content", content);
        return resultMap;
    }
}

日志打印结果

Spring Controller 打印入参/出参

过程记录

日志打印存在的问题:打印请求与打印响应并不是相邻输出,查看日志的时候需要添加上过滤条件

jackson 直接返回带中文的字符串,中文显示乱码 ????18?。将字符串放到HashMap 中返回,中文正常显示{"content": "张三今年18岁"}

@LogPrint 注解加上后日志不打印?<aop:aspectj-autoproxy/> 没有添加导致 aop 在 spring 框架中不启用

日志打印简化版本,日志过滤

添加

<!-- aop 配置批量添加切面 -->
<aop:config>
    <aop:advisor advice-ref="txAdvice"
                 pointcut="execution(* cn.exrick.manager.service..*.*(..))" />
</aop:config>

todo

  • 注解的实现
  • jsonUtil 的实现
  • jackson post 请求拿不到数据(使用 postman模拟请求前提下)
  • 根据日志id,过滤日志,在 linux 中怎样进行过滤

其他参考

Spring Controller 打印入参/出参

上一篇:总结的Java面试题与经验


下一篇:QQ公众号&微信公众号,左右互搏?