2008-10-30
■[Wicket][ActiveObjects][Guice][車輪]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]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で修正されるのか??
