我正在使用Play构建我的第一个GAE应用程序!框架和我遇到了锡耶纳和抽象类的问题。
应用内的一项功能是允许用户上传其他用户可以评论的帖子。但是,当我尝试创建从抽象Post
类继承的多个帖子类型时,我遇到了问题。
Post
类和相应的Picture
子类定义如下:
发布
public abstract class Post extends Model {
//***EDIT*** - added default constructor
public Post(){
}
@Id(Generator.AUTO_INCREMENT)
public long id;
@Filter("post")
public Query<Comment> comments;
public static Query<Post> all() {
return Model.all(Post.class);
}
public static Post findById(long id) {
return all().filter("id", id).get();
}
public Comment addComment( User user, String s_comment ){
Comment comment = new Comment( this, s_comment );
return comment;
}
public List<Comment> comments() {
return comments.order().fetch();
}
}
图片
public class Picture extends Post {
//***EDIT*** - added default constructor
public Post_Pic(){
}
public String path;
public String description;
}
以及相应的Comment
类:
注释
public class Comment extends Model {
@Id(Generator.AUTO_INCREMENT)
public long id;
@Index("post_index")
public Post post;
public String comment;
public static Query<Comment> all() {
return Model.all(Comment.class);
}
public static Comment findById(long id) {
return all().filter("id", id).get();
}
public Comment( Post post, String comment ){
this.post = post;
this.comment = comment;
}
}
我遇到的问题是,当我尝试为Picture
对象发表评论时,会抛出 InstantiationException
。
Siena(或Java)在检索Post
时是否尝试创建Comment
的新实例,结果抛出 InstantiationException
?如果是这样,有人能指出我正确的方向来实现我想做的事情吗?
我已经为我的模型添加了默认构造函数,但遗憾的是这没有效果。
抛出错误的测试代码如下:
@Test
public void commentPost_Pic(){
User bob = new User( fullname, email, password );
bob.insert();
bob = User.connect( email, password );
assertNotNull( bob );
Post_Pic post_pic = new Post_Pic();
post_pic.insert();
Comment comment = post_pic.addComment( bob, testComment );
comment.insert();
List<Comment> comments = post_pic.comments(); //**** <- Error gets thrown here
assertEquals( 1, comments.size() );
}
InstantiationException
会在List<Comment> comments = post_pic.comments();
行投放。
答案 0 :(得分:1)
尝试在模型中创建默认构造函数... Siena使用反射来创建类,但它不会尝试使用特定的构造函数! 告诉我它是否更好!