Spring AOP Pointcut不会触发

我是Spring和AOP的新手。 我正在尝试这个简单的事情,我创建了一个自定义注释,在任何方法之前放置应该执行一些代码。 这是我创建的注释

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

接下来,我创建了包含逻辑的Spring Aspect类

 @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"); } 

问题是我的spring永远不会被触发。 我在configuration.xml包含了一个bean

     

任何人都可以指出我错过了什么?

您的代码有几个问题:

  1. 您应该将ValidationTest对象创建为由Spring管理的bean而不是使用new
  2. 应该是 ; 为了简单起见,你实际上可以坚持使用
  3. 之前的方面不支持ProceedingJoinPoint ,因此将其删除; 如果需要访问参数,可以使用JoinPoint
  4. JsonSchemaAnnotation jsonSchemaAnnotation参数应该存在于您方面的validateJson方法中,如frant.hartm所指出的

我认为您需要完全限定名称或方法中的参数:

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

(你也需要使用豆子,正如德米特里库斯科夫指出的那样