2016-11-17 160 views
0

我創建一個類來調用審覈我的春天啓動的應用程序的控制器類:Spring AOP和RequestMapping註解

@Aspect 
@Component 
public class ServiceAudit { //RequestMappingInterceptor { 
@Pointcut("@annotation(requestMapping) && execution(* *(..))") 
public void controller(RequestMapping requestMapping) {} 

@Before("controller(requestMapping)") 
public void advice(JoinPoint thisJoinPoint, RequestMapping requestMapping) { 
    String url = requestMapping.value()[0]; 
    String httpMethod = requestMapping.method()[0].toString(); 
... 
... 

我的一個控制器類看起來是這樣的 - 與類和方法級別的註解(其我不能改變在這一點):

RestController 
@CrossOrigin 
@EnableConfigurationProperties 
@RequestMapping(value = "/applications") 
public class ApplicationController { 

    ... 
    ... 


@RequestMapping(value = "/{id}", method = RequestMethod.GET) 
public ResponseEntity<Application> findById(@PathVariable Integer id) throws Exception { 

    ... 
    ... 
} 

我可以拉的url,methodtype,參數罰款。然而,什麼我有做的是拉控制器類的註釋(‘/應用程序’)的一個非常困難的時間,所以我可以建立我的審計表的完整URL。

我知道還有其他選項審計(比如Spring啓動器),但我需要使用與因各種原因方面的這種做法,我只是堅持在這裏。 Spring的AnnotationUtils似乎很有幫助,但我堅持使用代碼來獲取類級別的註釋。任何人都做過這個?

UPDATE: 感謝。這沒有用。你說得對 - 這是一個多餘的一塊,它的工作時,我刪除了「執行」的一部分,但還是同樣的問題。本質上,問題是如何在這種情況下獲得類級別的註釋。因此,對於我的ApplicationsController類,如何檢索在類級別定義的'/ applications'路徑。我認爲這是在那裏,但它是嵌套在requestMapping對象如此之深,我無法弄清楚如何解壓。現在,唯一的解決辦法我已經是創造我的控制器一個HashMap(ApplicationsController - >「/應用程序」),然後使用methodInvocation.targetClass作爲重點在於地圖。當我添加一個控制器時,不是很優雅,需要維護。

+0

試試,除去執行(* *(..))從點切 – kuhajeyan

+0

感謝。這沒有用。你是對的 - 這是一個多餘的部分,它在我刪除那部分但仍然是同樣的問題時起作用。 – Mike

回答

0

您可以捕捉類級別的註解是這樣的:

@Pointcut("@target(classRequestMapping) && @annotation(requestMapping) && execution(* *(..))") 
public void controller(RequestMapping classRequestMapping, RequestMapping requestMapping) {} 

@Before("controller(classRequestMapping, requestMapping)") 
public void advice(JoinPoint thisJoinPoint, RequestMapping classRequestMapping, RequestMapping requestMapping) { 
    // do whatever you want with the value 
} 
+0

謝謝。這很有幫助。 – Mike