我使用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
suptypes的方法?因爲參考指出參數類型不能是通用的Collection
s。
沒有運氣。我沒有讀過關於類聲明和方法參數中使用的「+」,但沒有在返回類型中使用,可能它沒有(還)在那裏被支持?我應該注意到,我的'Model'實際上不是一個接口,而是一個抽象類,我也會在我的問題中改變它。 – delucasvb
@delucasvb,我編輯了我的答案。 – alfcope
仍然無法得到這個工作......我試着用'value'參數和'pointcut'參數。沒有錯誤,方面的方法從未被調用過。當使用「執行」通知btw時,您必須指定返回類型,但它可以是通配符「*」。 – delucasvb