我使用Spring Boot设置REST API。我将制作一堆@RestController
并希望在那些返回我称为Model
的特定抽象类的子类型的方法上设置切入点。这些控制器看起来像这样:
@RestController
public class UserController {
@RequestMapping(...)
public Person getAllPeople() {
...
}
}
我的Person
类看起来像这样:
public class Person extends Model {
...
}
那么可以编写看起来像这样的建议:
@Aspect
@Component
public class ModelAspect {
@AfterReturning(
value = "execution(<T extends mypackages.Model> T mypackages.api.*.*(..))",
returning = "model")
public void doSomethingWithModel(Model model) {
...
}
}
当然,这不会起作用,因为这个建议在语法上是无效的。在参考文档中,我只找到了有关泛型参数的信息,而不是返回类型(Spring AOP reference)。我现在拥有的是这个,但我认为上面的例子会更有效率:
@Aspect
@Component
public class ModelAspect {
@AfterReturning(
value = "execution(* mypackages.api.*.*(..))",
returning = "model")
public void doSomething(Object model) {
if (model instanceof Model)
doSomethingWithModel((Model) model);
}
}
我的下一个问题是,对于那些返回Collection
Model
类型的Collection
的方法,情况可能相同吗?因为引用声明参数类型不能是通用var vm = new Vue({
el: '#vue-instance',
data: {
items: ["Item1", "Item2"]
}
});
s。
答案 0 :(得分:3)
您尝试在界面后使用+吗?
@Aspect
@Component
public class ModelAspect {
@AfterReturning(
value = "execution(mypackages.Model+ mypackages.api.*.*(..))",
returning = "model")
public void doSomethingWithModel(Model model) {
...
}
}
您可以尝试不指定返回类型。根据文档,它将通过返回子句中使用的参数类型来解析:
return子句还将匹配仅限制为那些方法 返回指定类型值的执行(此处为Object) case,将匹配任何返回值)。
@Aspect
@Component
public class ModelAspect {
@AfterReturning(
value = "execution(* mypackages.api.*.*(..))",
returning = "model")
public void doSomethingWithModel(Model model) {
...
}
}
查看以下链接。它还回答了关于通用集合的第二个问题。
为了好奇,我创建了一个测试项目,它开始直接为我工作。我只能认为你的切入点指向的路径是错误的。试试:
@Aspect
@Component
public class ModelAspect {
@AfterReturning(
value = "execution(* mypackages.api..*(..))",
returning = "model")
public void doSomethingWithModel(Model model) {
...
}
}
您可以在以下位置查看我的项目:spring-aspectj-interfaces 在那里你会看到切入点的不同值(当然只有一个没有被注释),所有这些值都有效。