Java 使用泛型类型作为切入点的返回类型

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

我正在使用SpringBoot设置RESTAPI。我将制作一组
@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请查看此处的“子类型模式”部分: