2011-09-07 58 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