Java 使用泛型类型作为切入点的返回类型
我正在使用SpringBoot设置RESTAPI。我将制作一组Java 使用泛型类型作为切入点的返回类型,java,spring,spring-boot,spring-aop,Java,Spring,Spring Boot,Spring Aop,我正在使用SpringBoot设置RESTAPI。我将制作一组@RestController,并希望在那些返回我调用的特定抽象类Model的子类型的方法上设置一个切入点。这些控制器如下所示: @RestController public class UserController { @RequestMapping(...) public Person getAllPeople() { ... } } public class Person extends
@RestController
,并希望在那些返回我调用的特定抽象类Model
的子类型的方法上设置一个切入点。这些控制器如下所示:
@RestController
public class UserController {
@RequestMapping(...)
public Person getAllPeople() {
...
}
}
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) {
...
}
}
其中我的Person
类的外观如下:
@RestController
public class UserController {
@RequestMapping(...)
public Person getAllPeople() {
...
}
}
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) {
...
}
}
那么,有没有可能写出这样的建议:
@RestController
public class UserController {
@RequestMapping(...)
public Person getAllPeople() {
...
}
}
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) {
...
}
}
我的下一个问题是,对于那些返回
模型
类型的集合
的方法,是否同样可能?因为参考说明参数类型不能是泛型的Collection
s.您在界面后尝试过使用+吗
@Aspect
@Component
public class ModelAspect {
@AfterReturning(
value = "execution(mypackages.Model+ mypackages.api.*.*(..))",
returning = "model")
public void doSomethingWithModel(Model model) {
...
}
}
您可以尝试不指定返回类型。根据文档,它将通过returning子句中使用的参数类型来解决:
returning子句还将匹配限制为仅匹配那些方法
返回指定类型的值的执行(此
大小写,它将匹配任何返回值)
看看下面的链接。它还回答了您的第二个问题,关于通用集合
出于好奇,我创建了一个项目来测试这一点,它直接开始为我工作。我只能认为你的切入点指向的路径是错误的。尝试:
@Aspect
@Component
public class ModelAspect {
@AfterReturning(
value = "execution(* mypackages.api..*(..))",
returning = "model")
public void doSomethingWithModel(Model model) {
...
}
}
您可以在以下网址查看我的项目:
在这里,您将看到切入点的不同值(当然只有一个没有注释),所有这些值都有效。运气不好。我确实读过关于在类声明和方法参数中使用“+”,但在返回类型中不使用“+”,也许它(还)不受支持?我应该注意到,我的
模型
实际上不是一个接口,而是一个抽象类,我也会在我的问题中对其进行更改。仍然无法让它正常工作。。。我尝试了值
参数和切入点
参数。没有错误,只是从未调用方面的方法。顺便说一句,使用“执行”建议时必须指定返回类型,但它可以是通配符*
@delucasvb,是的,它是一个输入错误。当我说不要指定返回类型时,我的意思是使用星号。我已经编辑了我的答案。它有效!!结果证明我确实走错了路。我想我得找一个能帮我的工具。也许是有代码的completion@Cnfn请查看此处的“子类型模式”部分: