【发布时间】:2018-06-15 12:33:50
【问题描述】:
我有一个场景,我的方法被拦截在父类中,并且在切入点类中没有被覆盖。 以下是示例类:
public abstract class A{
@RequestMapping(value = "/data", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public String getData(@RequestBody String request) throws Exception {
return "dummy";
}
}
@RestController
public class B extends A {
}
我的方面被定义为:
@Aspect
@Component
public class RestCallLogger {
@Pointcut("within(com.test..*) && within(@org.springframework.web.bind.annotation.RestController *)")
public void restControllers() {
}
@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
public void requestMappingAnnotations() {
}
@Around("restControllers() && requestMappingAnnotations()")
public Object onExecute(ProceedingJoinPoint jp) throws Throwable {
Object result = null;
try {
result = jp.proceed();
} catch (Exception ex) {
throw ex;
}
return result;
}
}
但它不起作用。如果我用 Annotation @RestController 标记 A 类并使其具体化,那么它就可以工作。 问题是如何创建“父抽象类中方法的切入点”? PS:我无法将代码的层次结构更改为现有代码。
【问题讨论】:
-
我认为它不适用于抽象类,作为拦截方法调用的 aop。我们不能创建抽象类的对象。所以你应该为具体的切入点定义。
-
对于切入点,您需要声明抽象的底层实现。 Aspect 将在...周围/之前创建一个切入点,然后它将首先创建一个代理对象。每个代理实例都有一个关联的调用处理程序对象,该对象实现了接口
InvocationHandler.,该接口将用于调用实例调用处理程序的方法。更多关于这个docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html
标签: java spring aspectj spring-aop pointcut