Spring AOP切入点不触发
Spring AOP Pointcut does not trigger
我是 Spring 和 AOP 的新手。我正在尝试这个简单的事情,我创建了一个自定义注释,当放置在任何方法之前时应该执行一些代码。
这是我创建的注释
// Declares a custom annotation that validates json
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface JsonSchemaAnnotation {
}
接下来我创建了 Spring 方面 class 来保存逻辑
@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");
}
}
这是我的简单测试class
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 aop 从未被触发。我在 configuration.xml
中添加了一个 bean
<aop:aspectj-autoproxy>
<aop:include name="UpdateUIMetadataInterceptor" />
</aop:aspectj-autoproxy>
<bean id="updateUI" class="com.fico.cardinal.cm.interceptor.UpdateUIMetadataInterceptor" />
谁能指出我遗漏了什么?
我认为您需要方法中的完全限定名称或参数:
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
(而且您还需要使用这个 bean,正如 Dmitry Kuskov 指出的那样
您的代码有几个问题:
- 您应该将
ValidationTest
对象创建为由 Spring 管理的 bean,而不是使用 new
<aop:include name="UpdateUIMetadataInterceptor" />
应该是<aop:include name="updateUI"/>
;实际上,为了简单起见,您可以在这里坚持使用 <aop:aspectj-autoproxy/>
before方面不支持ProceedingJoinPoint
,所以删除它;如果您需要访问参数 ,则可以使用 JoinPoint
正如 所指出的那样,JsonSchemaAnnotation jsonSchemaAnnotation
参数应该用于您方面的 validateJson
方法
我是 Spring 和 AOP 的新手。我正在尝试这个简单的事情,我创建了一个自定义注释,当放置在任何方法之前时应该执行一些代码。 这是我创建的注释
// Declares a custom annotation that validates json
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface JsonSchemaAnnotation {
}
接下来我创建了 Spring 方面 class 来保存逻辑
@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");
}
}
这是我的简单测试class
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 aop 从未被触发。我在 configuration.xml
<aop:aspectj-autoproxy>
<aop:include name="UpdateUIMetadataInterceptor" />
</aop:aspectj-autoproxy>
<bean id="updateUI" class="com.fico.cardinal.cm.interceptor.UpdateUIMetadataInterceptor" />
谁能指出我遗漏了什么?
我认为您需要方法中的完全限定名称或参数:
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
(而且您还需要使用这个 bean,正如 Dmitry Kuskov 指出的那样
您的代码有几个问题:
- 您应该将
ValidationTest
对象创建为由 Spring 管理的 bean,而不是使用 new <aop:include name="UpdateUIMetadataInterceptor" />
应该是<aop:include name="updateUI"/>
;实际上,为了简单起见,您可以在这里坚持使用<aop:aspectj-autoproxy/>
before方面不支持ProceedingJoinPoint
,所以删除它;如果您需要访问参数 ,则可以使用 JsonSchemaAnnotation jsonSchemaAnnotation
参数应该用于您方面的validateJson
方法
JoinPoint
正如