GAE & Siena - абстрактные классы и исключения для экземпляров - PullRequest
0 голосов
/ 23 октября 2011

Я создаю свое первое приложение 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 Ответ

1 голос
/ 23 октября 2011

Попробуйте создать конструктор по умолчанию в ваших моделях ... Сиена использует отражение для создания классов, но не пытается использовать конкретные конструкторы!Скажите, работает ли он лучше!

...