簡體   English   中英

使用特定注釋對所有方法調用帶注釋的方面

[英]Invoke annotated aspect on all methods with a specific annotation

我有一個基於 MVC 的應用程序,我想記錄所有控制器的輸入/輸出。
此外,我的每個 controller 方法都帶有一些特定的注釋(例如: @MyControllerMethod )。
我寫了一個帶注釋的方面,當我在我的 controller 方法的方面使用注釋(例如: LogRequestReply )時,它可以正常工作。

@Around("@annotation(com.xyz.LogRequestReply)")
public Object logRequestResponse(ProceedingJoinPoint pjp) throws Throwable {
@MyControllerMethod
@LogRequestReply /* It invokes my logRequestResponse method */
public ResponseEntity controllerMethodA(...) {}

但是,我有很多 controller 方法,每個方法都帶有注釋MyControllerMethod
有沒有一種方法可以讓我的方面注釋默認在所有 controller 方法上工作,這樣每個方法都會自動調用我的方面記錄器並且我可以記錄輸入/輸出?

注意:我還考慮編寫一個從HandlerInterceptorAdapter擴展的攔截器。 但它有其自身的復雜性,即能夠記錄請求/響應,其中 stream 只能讀取一次。

請建議。

一種選擇是讓@Around 定義的限制更少,通過 package 或類似的東西添加限制。 在內部,您可以通過以下檢查檢查這是否是 Controller,然后打印請求/響應:

@Pointcut("within(com.mypackage.controller..*)")
private void inControllerPackage() {
}

@Around("inControllerPackage()")
public Object logRequestResponse(ProceedingJoinPoint pjp) throws Throwable {
    if (pjp.getSignature().getDeclaringType().isAnnotationPresent(RestController.class)) {
       ...
    } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM