CubbyとScalaを連携してみた
最近、TopHatenarやHatenarMapsをScalaに移行したいと思っているんですが、Liftはハードルが高すぎると判断して、試しにCubby上でScalaを動かしてみました。以下、その手順です。
使用環境
プロジェクトの雛形を作成
まず以下のように入力して、Cubbyプロジェクトの雛形を作成します。
mvn archetype:generate -DarchetypeCatalog=http://cubby.seasar.org
pom.xmlにScala用の記述を追加
作成されたpom.xmlを開いて、Scalaのリポジトリロケーションを追加します。
<repositories> <repository> <id>maven.seasar.org</id> <name>The Seasar Foundation Maven2 Repository</name> <url>http://maven.seasar.org/maven2</url> </repository> <repository> <id>scala-tools.org</id> <name>Scala-Tools Maven2 Repository</name> <url>http://scala-tools.org/repo-releases</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>scala-tools.org</id> <name>Scala-Tools Maven2 Repository</name> <url>http://scala-tools.org/repo-releases</url> </pluginRepository> </pluginRepositories>
次に、
<plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> <executions> <execution> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin>
最後に、Scala用の
<dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>2.7.4</version> </dependency>
Eclipseにプロジェクトをインポート
Scalaでコーディング
後は、アクションやロジックを適当にScalaでコーディングしていきます。ここではとりあえず、ScalaActionというアクションを書いてみました。
package com.kaiseh.scalawebapp.action import scala.reflect._ import org.seasar.cubby.action._ class ScalaAction extends Action { @RequestParameter @BeanProperty var name: String = _ def hello = new Json("Hello " + name) }
ScalaとJavaフレームワークを連携させるとき、@BeanPropertyアノテーションが重要になります。
上のコードでvar宣言されたnameは、一見Javaのpublicフィールド相当に思えますが、実際にはJavaからは以下のアクセサしか見えません。
public String name(); // getter public void name_$eq(String name); // setter
ここでnameに@BeanPropertyアノテーションを付けると、上記のgetter / setterに加えてgetName() / setName()も生成されるので、JavaBeanを使う既存のフレームワークと連携しやすくなります(この例の場合、Cubbyがリクエストパラメータをバインドしてくれる)。