GAE & Siena - абстрактные классы и исключения экземпляров
Я создаю свое первое приложение GAE, используя Play! Framework и у меня возникли проблемы с Сиеной и абстрактными классами.
Функция в приложении позволяет пользователю загружать сообщения, которые могут комментировать другие пользователи. Тем не менее, я сталкиваюсь с проблемами, когда я пытаюсь создать несколько типов записей, которые наследуются от абстрактного 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
брошен
Пытается ли Сиена (или 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();
,
1 ответ
Попробуйте создать конструктор по умолчанию в ваших моделях... Сиена использует отражение для создания классов, но не пытается использовать конкретные конструкторы! Скажите, если это работает лучше!