- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Spring Boot 设置 REST API。我将制作一堆 @RestController
,并希望在那些返回特定抽象类的子类型的方法上设置一个切入点,我称之为 Model
。这些 Controller 看起来像这样:
@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);
}
}
我的下一个问题是,对于那些返回 Model
的 suptypes 的 Collection
的方法,是否同样可行?因为引用声明参数类型不能是泛型 Collection
。
最佳答案
您是否尝试过在界面后使用 +?
@Aspect
@Component
public class ModelAspect {
@AfterReturning(
value = "execution(mypackages.Model+ mypackages.api.*.*(..))",
returning = "model")
public void doSomethingWithModel(Model model) {
...
}
}
您可以尝试不指定返回类型。根据文档,它将通过返回子句中使用的参数类型来解析:
A returning clause also restricts matching to only those method executions that return a value of the specified type ( Object in this case, which will match any return value).
@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在那里你会看到切入点的不同值(当然只有一个没有注释),所有这些值都是有效的。
关于java - 使用泛型类型作为切入点的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42455195/
我是一名优秀的程序员,十分优秀!