gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:05 25 4
gpt4 key购买 nike

我正在使用 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) {
...
}
}

看看下面的链接。它也回答了你的第二个问题,关于泛型集合。

Aspectj Matching Return Type


出于好奇,我创建了一个项目来测试它,它开始直接为我工作。我只能认为你的切入点指向的路径是错误的。尝试:

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com