2017-02-25 95 views
2

我使用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); 
    } 
} 

我的下一個問題是,同樣是可能的那些返回CollectionModel suptypes的方法?因爲參考指出參數類型不能是通用的Collection s。

回答

2

你試過在你的界面之後使用+嗎?

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

您可以嘗試不指定返回類型。基於文檔它將通過在返回子句中使用的參數的種類來解決上:

甲返回子句也限制了只能匹配到那些方法 執行,在該返回指定類型的值(對象 的情況下,將匹配任何返回值)。

@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 在那裏,你將看到不同的值作爲切入點(唯一一個沒有評論,當然),所有的人都有效。

+0

沒有運氣。我沒有讀過關於類聲明和方法參數中使用的「+」,但沒有在返回類型中使用,可能它沒有(還)在那裏被支持?我應該注意到,我的'Model'實際上不是一個接口,而是一個抽象類,我也會在我的問題中改變它。 – delucasvb

+1

@delucasvb,我編輯了我的答案。 – alfcope

+0

仍然無法得到這個工作......我試着用'value'參數和'pointcut'參數。沒有錯誤,方面的方法從未被調用過。當使用「執行」通知btw時,您必須指定返回類型,但它可以是通配符「*」。 – delucasvb