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;
    }
}

日志打印結果

過程記錄

日志打印存在的問題:打印請求與打印響應並不是相鄰輸出,查看日志的時候需要添加上過濾條件

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 中怎樣進行過濾

其他參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM