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
任何人都可以指出我错过了什么?
您的代码有几个问题:
- 您应该将
ValidationTest
对象创建为由Spring管理的bean而不是使用new -
应该是
; 为了简单起见,你实际上可以坚持使用 - 之前的方面不支持
ProceedingJoinPoint
,因此将其删除; 如果需要访问参数,可以使用JoinPoint
-
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
(你也需要使用豆子,正如德米特里库斯科夫指出的那样