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

时间:2017-02-25 11:02:54

标签: java spring spring-boot spring-aop

我使用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。

1 个答案:

答案 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) {
        ...
    }
}

查看以下链接。它还回答了关于通用集合的第二个问题。

Aspectj Matching Return Type

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

@Aspect
@Component
public class ModelAspect {
    @AfterReturning(
        value = "execution(* mypackages.api..*(..))",
        returning = "model")
    public void doSomethingWithModel(Model model) {
        ...
    }
}

您可以在以下位置查看我的项目:spring-aspectj-interfaces 在那里你会看到切入点的不同值(当然只有一个没有被注释),所有这些值都有效。