2011-09-07 59 views
0

我想爲我的Play實現一個RESTful接口!使用通用包裝器的框架模型。Play的通用包裝方法!模型

我想使用泛型方法來調用並返回每個模型各自的「查找」方法。

private static <T extends GenericModel> void getModel(T model, Params params){ 
if (params._contains("id")){ 
    renderJSON(model.findById(params.get("id", Long.class))); 
} 
else{ 
    renderJSON(model.findAll()); 
} 

}

上述方法被稱爲如下,在根據我的控制器的GET方法,其模型通過一特定的路線請求:

getModel(new User(), params); 

由於查找()方法實際上是GenericModels類的靜態方法,它應該完全有可能。然而,由於發揮每個定義的模型生成的代碼我得到這個錯誤:

UnsupportedOperationException異常發生:請@ javax.persistence.Entity註解註釋的JPA模型。

至少,我認爲這是原因。有沒有辦法解決這個問題?我是否被迫爲每個類實施相同的GET,PUT,UPDATE,DELETE方法?

回答

1

我認爲「model.findById」調用未實現的GenericModel.findById靜態函數並生成異常。它不會在運行時調用JPAPlugin增強的靜態函數。

我不知道它會工作,但你應該嘗試直接調用JPQL功能,是這樣的:

private static <T extends GenericModel> void getModel(Class<T> clazz, Params params){ 
if (params._contains("id")){ 
    renderJSON(JPQL.instance.findById(clazz.getSimpleName(), params.get("id", Long.class))); 
} 
else{ 
    renderJSON(model.findAll()); 
} 

,並調用它像下面這樣:

getModel(new User(), User.class, params); 
+0

JPQL似乎扔同樣的錯誤。看來,使用泛型時,模型的Play代碼根本無法訪問。無論如何感謝您的答案。儘管使用通用包裝器/方法會更優雅,但似乎具體是唯一的出路。 – sw00

+0

基本上,模型字節碼在運行時增強,並且GenericModel.findById函數被YourClass級別的新字符替換。因爲它是靜態的,並且靜態函數不是「可覆蓋」的,所以它肯定會調用它在GenericModel中編譯時可以找到的那個:(...對不起,如果我的解決方案不好;)! – mandubian

+0

它似乎是框架的限制,而不是你的代碼。所以不用擔心。 – sw00