Hatena::ブログ(Diary)

日記 このページをアンテナに追加 RSSフィード

2008-10-30

[][][][]Wicket+ActiveObjects+GuiceアプリをUpしてみるテストWicket+ActiveObjects+GuiceのアプリをUpしてみるテスト。 - 日記 を含むブックマーク Wicket+ActiveObjects+GuiceのアプリをUpしてみるテスト。 - 日記 のブックマークコメント

Wicket+ActiveObjects+Guiceの組み合わせでアプリ作ってたんだけど、

一段落したので、こっそりGoogle Codeにアップしてみた。

http://yamaguchi.googlecode.com/svn/trunk/mailbox/

メールサーバに接続して、メールボックスの容量を計測して、画面に表示するというだけのもの。

うちの会社のメールサーバがよく容量オーバーで死ぬので作ってみました。。

「Serializableなものしか扱わないWicketとSerializableでないActiveObjectsのエンティティの間をどう取り持つべきか」

がよくわからんかった。

結局、Seasar2のAOPProxyとか使ってるけど(cglibとかわからんのでwww)、もっとうまい方法があるはず。

ActiveObjectsがクラスを生成するところとかソースをもうちょっと眺めればいいんだろうけど。。。(cglibとかわからんのでwww)

2008-08-07

[][][]Wicket+Guice+ActiveObjectsでEntityManagerをInjectできない。 Wicket+Guice+ActiveObjectsでEntityManagerをInjectできない。 - 日記 を含むブックマーク Wicket+Guice+ActiveObjectsでEntityManagerをInjectできない。 - 日記 のブックマークコメント

めそらぼ - mesolabs.com » WicketとGuiceとActiveObjectsで作ったTwitterを使ったMashUpアプリを公開するよ

ここに触発されてWicket+Guice+ActiveObjectsという組み合わせでWebあぷり作成中。

まずは、WebApplicationの派生クラスを作成。

EntityManagerクラスをバインドするように実装した。


public class WicketApplication extends WebApplication {

    @Override
    protected void init() {
        addComponentInstantiationListener(new GuiceComponentInjector(this,
                getModule()));
    }

    private Module getModule() {
        return new Module() {
            public void configure(Binder binder) {
                binder.bind(EntityManager.class).toInstance(
                        new EntityManager("jdbc:derby:test;create=true",
                                "user", "password"));
            }
        };
    }

    /**
     * @see wicket.Application#getHomePage()
     */
    @Override
    public Class<?> getHomePage() {
        return HomePage.class;
    }
}

で、HomePage.javaには


public class HomePage extends WebPage {

    @Inject
    EntityManager manager;

    public HomePage(final PageParameters parameters) throws Exception {
      //ここにDBアクセスのコードを・・・
    }
}

こんな感じで書いたんだけど、実行時にExceptionがスローされる。


ERROR - RequestCycle               - Can't instantiate page using constructor public com.googlecode.yamaguchi.HomePage(org.apache.wicket.PageParameters) throws java.lang.Exception and argument
org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor public com.googlecode.yamaguchi.HomePage(org.apache.wicket.PageParameters) throws java.lang.Exception and argument
        at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:168)
...(略)

Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
...(略)

Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
        at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:718)
        at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
...(略)

EntityManagerには引数なしのコンストラクタが定義されていないので、cglibがインスタンス化できないらしい。

Google先生にいろいろ聞いて、最終的にはここにたどり着く。

[#WICKET-1130] Injection of Bound Instance Fails with Exception - ASF JIRA

1.5-M1で修正されるのか??