2015-08-13 103 views
0

我是Spring和AOP的新手。我正在嘗試這個簡單的事情,我已經創建了一個自定義註釋,當它放在任何方法之前時應該執行一些代碼。 這是註釋,我創建Spring AOP切入點不觸發

// Declares a custom annotation that validates json 
    @Retention(RetentionPolicy.RUNTIME) 
    @Target(ElementType.METHOD) 
    public @interface JsonSchemaAnnotation { 
    } 

接下來,我創建了春天看點類持有邏輯

@Aspect 
public class UpdateUIMetadataInterceptor { 

@Pointcut("execution(public * com.fico.cardinal.cm.*.*(..))") 
public void anyPublicMethod() { 
    System.out.println("Running"); 
} 

@Before("anyPublicMethod() && @annotation(jsonSchemaAnnotation)") 
public void validateJson(ProceedingJoinPoint pjp) throws Throwable { 
    System.out.println("Running"); 
} 

} 

這是我簡單的測試類

public class ValidationTest { 

public static void main(String[] args) { 
    ApplicationContext context = new ClassPathXmlApplicationContext("spring/configuration.xml"); 
    String jsondata = "{\"id\": \"EXPENSE_REPORT\",\"properties\": {\"transactionType\": \"EXPENSE_REPORT\"},\"sections\": []} ]}"; 
    ValidationTest test = new ValidationTest(); 
    test.jsonValidationTest("dummy", jsondata); 
    ((AbstractApplicationContext) context).close(); 


} 

@JsonSchemaAnnotation 
public void jsonValidationTest(String dummy, String jsondata) { 
    System.out.println("Success"); 

} 

問題是我的春天aop永遠不會被觸發。我已經包含在一個bean我configuration.xml

<aop:aspectj-autoproxy> 
    <aop:include name="UpdateUIMetadataInterceptor" /> 
</aop:aspectj-autoproxy> 
<bean id="updateUI"  class="com.fico.cardinal.cm.interceptor.UpdateUIMetadataInterceptor" /> 

任何人都可以指出我錯過了什麼?

+0

指出,我按照[這](http://eggsylife.co .uk/2010/02/03/spring-annotation-based-aop-and-inter-ball-of /)博客 – rockydgeekgod

+1

你用new創建你的'ValidationTest'對象,所以它不被Spring管理。你必須在你的應用程序上下文中將它作爲一個bean,然後通過你的'context'變量獲得對它的引用 –

+0

剛剛通過bean創建它。仍然沒有改善。我想我錯過了更多。 – rockydgeekgod

回答

2

你有幾個問題與您的代碼:

  1. 您應該創建ValidationTest對象由Spring管理的Bean並沒有使用新的
  2. <aop:include name="UpdateUIMetadataInterceptor" />應該是<aop:include name="updateUI"/>;你可以在這裏簡單地堅持使用<aop:aspectj-autoproxy/>
  3. ProceedingJoinPoint不支持以前的方面,所以刪除它;您可以使用JoinPoint,而是如果你需要訪問參數
  4. JsonSchemaAnnotation jsonSchemaAnnotation參數應該存在於您的方面validateJson方法,由frant.hartm
+0

是的,這應該做到這一點,我錯過了包括錯誤的名稱:-) –

+0

我需要使用註釋方法的參數。這就是我使用ProceedingJoinPoint的原因。我應該如何訪問參數而不使用它? – rockydgeekgod

+0

我已根據您的建議編輯了我的代碼。 (檢查問題)但仍然我的方面類沒有觸發。 – rockydgeekgod

1

我認爲你需要或者完全合格的名稱或方法參數:

FQN:

@Before("anyPublicMethod() && @annotation(your.package.JsonSchemaAnnotation)") 
public void validateJson(ProceedingJoinPoint pjp) throws Throwable { 
    System.out.println("Running"); 
} 

參數:

@Before("anyPublicMethod() && @annotation(jsonSchemaAnnotation)") 
public void validateJson(ProceedingJoinPoint pjp, JsonSchemaAnnotation jsonSchemaAnnotation) throws Throwable { 
    System.out.println("Running"); 
} 

來源:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-pointcuts

(和你也需要使用這個豆,就像Dmitry Kuskov指出的

+0

我都嘗試完全合格的名稱 '@Before( 「anyPublicMethod()&& @annotation(com.fico.cardinal.cm.interceptor.JsonSchemaAnnotation)」)' 和參數 '前公共無效(ProceedingJoinPoint PJP, JsonSchemaAnnotation jsonSchemaAnnotation)throws Throwable' 但它在任何情況下都不起作用 – rockydgeekgod