イトウ アスカ blog このページをアンテナに追加 RSSフィード

2011-02-28

Wicket 1.5-rc2 リリース!

 Wicket 1.5-rc2 がリリースされました。なぜか今回は「RC2」ではなく「rc2」です。お間違えのないようご注意ください(笑)。

 これは私にとってとても嬉しいリリースなのです! このリリースにあわせて wicketstuff の 1.5-rc2 がリリースされました。そしてこの中に WicketScala 拡張があるのですが、この度はじめて Scala 2.8.1 対応となりました!(これまでは 2.7.5)。これでシコシコ SNAPSHOT をビルドする必要がなくなります。やったね!

2011-02-24

Scala + Wicket にあう ORM を探す

 面白みがないので JPA はとりあえずおいときます。Doma がお気に入りなので、Doma が念頭にあったりします。それを踏まえて Scala + Wicket にあう ORM を探しています。文中でいう「エンティティ」とはレコードと紐づくクラスのことです。

Squeryl

 Wicket で利用するなら直列化に関する仕組みがしっかりできていないといけません。Squeryl その点でポロポロ問題がでました。以前もとりあげましたが、まず、エンティティに定義している serialVersionUID がなぜか永続化対象になってしまいます。これはバグでしょう。それから、エンティティのフィールドにカスタム型(ユーザ定義型)が使えるのですが、そのカスタム型が必ず継承しなければならないクラスが Serializable ではないのでカスタム型を使用したエンティティは直列化できなくなってしまいます。

 結論としては現時点では Squeryl は Wicket との相性は悪いです。ただ、以下の ORM に比べると、エンティティをイミュータブルにできたり、フィールドの型に Option 型を使用することができるなどとても Scala 的です。今後に期待しています。

Circumflex ORM

 Circumflex という Web アプリケーションフレームワークがあるのですが、その ORM を単独で使うことができます。ドキュメントが少なく、トランザクション管理のやり方を見つけるまでずいぶん苦労しました。「やりすぎ」と評される DSL っぷりですが、その分、直感的な使い方ができたりもします。おそらく必要になったときに DB セッションが始まるという仕組みになっていて、リクエストサイクルリスナでコミットロールバックしてあげればどこでセッションがどれだけ使われるかわからないような Wicket にはうってつけの仕組みだと思います。

 Squeryl のようにエンティティをイミュータブルにすることはできなさそうです。また、デフォルトで対応している型が少ないのもネックで BINARY(byte 配列)型にも対応していません。

MyBatis

 iBatis あらため MyBatis です。これは Scala ネイティブではありません。非常に柔軟で、エンティティに縛りがほとんどありません。ただ、そもそも Java 用ですので(.Net 版もあるが)Scala 側から歩み寄らなかればならない点もいくつかあります。フィールドにカスタム型が指定できますが Option 型を扱うためのいい方法が私には見つかりませんでした。

 Guice との連携も簡単で、これ単独で AOP によるトランザクション境界も設定できて Wicket との相性は良いです。Scala 的でない部分に目をつぶれば良い選択肢だと思います。

2011-02-13

Scala + Wicket + Squeryl を試してみた

 私は前々から WicketScala と相性がいいに違いないと言ってはいましたが、未だに試していなかったのでこの連休を利用して試してみました。ORM は最近 Doma がお気に入りだったのですが、Scala では APT が使えないので Squeryl を試してみました。

とにかく直列化が鬼門

 Wicket といったら、とにかく Serializable です。Scala の場合は、直列化可能なクラスには @serializable を付けるのがお約束です。ところが、これは java.io.Serializable を実装するのとは意味が違っているようで、Model に食わせることができないのですね。

 それから、WicketScala ネイティブフレームワークではないので、ほうぼうで Java コレクションが使われているわけです。Scala には Scala コレクションを Java コレクションに変換する機能があるわけですが、この変換結果が Wicket から見ると Serializable じゃないので、警告ログが出てしまいます。なので、コピーコンストラクタを使ったりするはめになり、オーバーヘッドがちょっと気になるところ。

 Squeryl は「Scala ORM」でググッたら一番初めに出てきたので使ってみただけなのですが、仕組み的にはとても好みに合いました。Doma と同じく、フィールドにドメインオブジェクトを使用することができ、さらにエンティティをイミュータブルにできるってのが良いです(これは私の Doma の不満点のひとつでした)。ところが、こいつ、SerialVersionUID すら永続化しようとするのですよ。エンティティ中の永続化しないプロパティをアノテーションによって指定することができるのですが、Scala は SerialVersionUID をアノテーションで指定するので、これで永続化対象で外すことできなさそうです。なので、Wicket でちょいと使いにくいかなと思いました(とりあえず、@serializable だけをつけて @SerialVersionUID をつけないようにして回避しています)。

2011-02-08

昨日の Wicket に関するつぶやき

  • Wicket かわいいよ、Wicket
  • Wicket には BigInteger のコンバータがない。BigDecimal はある。
    • Doma は BigInteger に対応している。けど、Wicket に BigInteger のコンバータがないし、自分で作るのもめんどい割に報われなさそう(使わなさそう)だから、自作のドメイン用コンバータは BigInteger へは当面非対応で。
    • と思ったけど、BigDecimal にしてから、toBigInteger で暫定的に対応しようかしら。

2010-08-17

Wicket 1.4.10 リリース

先週 Wicket 1.4.10 がリリースされましたね。新たに Component クラスに onInitialize() メソッドと onConfigure() メソッドが追加されました。

onInitialize() は、これまでコンストラクタで行っていたような初期化処理を行うためにオーバーライドして使います。

なぜコンストラクタで行ってはいけないかというと、コンストラクタで行うとコンポーネントの相互参照ができないなど「インスタンス化の順序」が問題になることがあるからです。

onInitialize() は、Page オブジェクトに直接または親コンポーネントを経るなりして add された場合、ライフサイクルの最初に実行されます。

私は、Swing のようにイベントリスナを準備して継承を用いずにコンポーネントの機能を拡張できるようにコンポーネントをカスタマイズして使うことが多いのですが、これまでは初期化処理がイベント駆動にできずに多少不便を感じていました。これで初期化処理もイベント駆動にできるのでこの機能は歓迎しています。

onConfigure() は、onBeforeRender() を補完するものとなるでしょう。onBeforeRender() はデフォルトではレンダリングされないことが明らかな場合は実行されません。たとえば、setVisible(boolean) で false が渡された場合などです。

それに対して onConfigure() は、そのコンポーネントが属するページにリクエストがあれば必ず実行されます。そのため、例えば「リクエストされた時刻が17:00を過ぎていた場合のみ表示」といった処理が割りと簡単に書けます。