Getting Started with Spring Roo その1

Spring Rooとは

Spring Roo は、Javaによる Springアプリケーション開発を効率化するコード生成ツールです。現在のバージョンは1.0.0.RC1となっています。まぁ、Java版のRailsみたいな感じですが、ラウンドトリップが行えます。簡単なコマンドでMavenのpom.xmlやソースを作成してくれます。

インストール

以下のサイトよりSpring Rooを取得します。今回取得したファイルはSpring Roo 1.0.0.RC1になります。
http://www.springsource.org/roo
任意ディレクトリに解凍した後、\bin へパスを通します。ここではC:\spring-rooに解凍したものとし、環境変数のPathにC:\spring-roo\binを追加します。

spring roo の起動

コマンドプロンプトより以下の操作を行います。

mkdir wedding
cd wedding
roo

作成するアプリケーション用のディレクトリを作成し、rooコマンドを実行しています。以下のような画面となりrooコンソールが起動されます。

    ____  ____  ____
   / __ \/ __ \/ __ \
  / /_/ / / / / / / /
 / _, _/ /_/ / /_/ /
/_/ |_|\____/\____/    1.0.0.RC1 [rev 198]


Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER.
Initializing Timer
roo>

hintと入力すると、行うべき作用のヒントが表示されます。

roo> hint
Welcome to Roo! We hope you enjoy your stay!

Before you can use many features of Roo, you need to start a new project.

To do this, type 'create project' (without the quotes) and then hit TAB.

Enter a -topLevelPackage like 'com.mycompany.projectname' (no quotes).
When you've finished completing your -topLevelPackage, press ENTER.
Your new project will then be created in the current working directory.

Note that Roo frequently allows the use of TAB, so press TAB regularly.
Once your project is created, type 'hint' and ENTER for the next suggestion.
You're also welcome to visit http://forum.springframework.org for Roo help.

ここで言われているように、create projectコマンドで新しいプロジェクトを作成します。createと入力してTABキーを押すと、コマンドが補間されるため楽です。パッケージ名も同時に指定します。

roo> create project -topLevelPackage com.wedding
Created C:\Documents and Settings\・・・\work\wedding\pom.xml
Created SRC_MAIN_JAVA
Created SRC_MAIN_RESOURCES
Created SRC_TEST_JAVA
Created SRC_TEST_RESOURCES
Created SRC_MAIN_WEBAPP
Created SRC_MAIN_RESOURCES\META-INF\spring
Created SRC_MAIN_RESOURCES\META-INF\spring\applicationContext.xml

このコマンドにより、RooはMaven2のプロジェクトのひな形が作成され、pom.xmlなどもできています。


さて、再びhintを見てみましょう。

roo> hint
Roo requires the installation of a JPA provider and associated database.

Type 'install jpa' and then hit TAB three times.
We suggest you type 'H' then TAB to complete "HIBERNATE".
After the -provider, press TAB twice for database choices.
For testing purposes, type (or TAB) HYPERSONIC_IN_MEMORY.
If you press TAB again, you'll see there are no more options.
As such, you're ready to press ENTER to execute the command.

Once JPA is installed, type 'hint' and ENTER for the next suggestion.

jpaプロバイダをインストールするよう指示があるので従います。

roo> install jpa -provider HIBERNATE -database H2_IN_MEMORY
Created SRC_MAIN_RESOURCES\META-INF\persistence.xml
Created SRC_MAIN_RESOURCES\META-INF\spring\database.properties
Managed SRC_MAIN_RESOURCES\META-INF\spring\applicationContext.xml
Managed ROOT\pom.xml

これによりpom.xmlに指定した内容が反映されます。以下のコマンドでデータベースの設定を確認できます。

roo> database properties
database.driverClassName = org.h2.Driver
database.password =
database.url = jdbc:h2:mem:wedding;DB_CLOSE_DELAY=-1
database.username = sa


さて、hint。

roo> hint
You can create entities either via Roo or your IDE.
Using the Roo shell is fast and easy, especially thanks to the TAB completion.

Start by typing 'new p' and then hitting TAB twice.
Enter the -name in the form '~.domain.MyEntityClassName'
In Roo, '~' means the -topLevelPackage you specified via 'create project'.

Afer specify a -name argument, press SPACE then TAB. Note nothing appears.
Because nothing appears, it means you've entered all mandatory arguments.
However, optional arguments do exist for this command (and most others in Roo).
To see the optional arguments, type '-' and then hit TAB. Mostly you won't
need any optional arguments, but let's select the -testAutomatically option
and hit ENTER. You can always use this approach to view optional arguments.

After creating an entity, use 'hint' for the next suggestion.

エンティティを作成するためにnew pと入力してTABキー押せと言われているので従います。チルダでルートパッケージを指定できます。以下のようにエンティティを作成します。

roo> new persistent class jpa -name ~.domain.Rsvp
Created SRC_MAIN_JAVA\com\wedding\domain
Created SRC_MAIN_JAVA\com\wedding\domain\Rsvp.java
Created SRC_MAIN_JAVA\com\wedding\domain\Rsvp_Roo_Entity.aj
Created SRC_MAIN_JAVA\com\wedding\domain\Rsvp_Roo_ToString.aj
Created SRC_MAIN_JAVA\com\wedding\domain\Rsvp_Roo_Configurable.aj

wedding\src\main\java\com\wedding\domain に以下のファイルが作成されます。

  • Rsvp.java
  • Rsvp_Roo_Configurable.aj
  • Rsvp_Roo_Entity.aj
  • Rsvp_Roo_ToString.aj

Rsvp.java はエンティティのクラスで、その他が AspectJ のファイルとなります。
Rsvp.java の中身は以下のようになっています。

package com.wedding.domain;

import javax.persistence.Entity;
import org.springframework.roo.addon.entity.RooEntity;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.tostring.RooToString;

@Entity
@RooEntity
@RooJavaBean
@RooToString
public class Rsvp {
}


さてhint

roo> hint
You can add fields to your entities using either Roo or your IDE.

To add a new field, type 'add field' and then hit TAB. Be sure to select
your entity and provide a legal Java field name. Use TAB to find an entity
name, and '~' to refer to the top level package. Also remember to use TAB
to access each mandatory argument for the command.

Afer completing the mandatory arguments, press SPACE, type '-' and then TAB.
The optional arguments shown reflect official JSR 303 Validation constraints.
Feel free to use an optional argument, or delete '-' and hit ENTER.

If creating multiple fields, use the UP arrow to access command history.

After adding your fields, type 'hint' for the next suggestion.
To learn about setting up many-to-one fields, type 'hint relationships'.

エンティティにフィールドを追加しろと言っています。以下のようにフィールドを指定します。

roo> add field string -fieldName code -notNull -sizeMin 1 -sizeMax 30
roo> add field string -fieldName email -sizeMax 30
roo> add field number -fieldName attending -type java.lang.Integer
roo> add field string -fieldName specialRequests -sizeMax 100
roo> add field date jpa -fieldName confirmed -type java.util.Date

これにより、Rsvpのコードは以下のようになります。

package com.wedding.domain;

import javax.persistence.Entity;
import org.springframework.roo.addon.entity.RooEntity;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.tostring.RooToString;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@RooEntity
@RooJavaBean
@RooToString
public class Rsvp {

    @NotNull
    @Size(min = 1, max = 30)
    private String code;

    @Size(max = 30)
    private String email;

    private Integer attending;

    @Size(max = 100)
    private String specialRequests;

    @Temporal(TemporalType.TIMESTAMP)
    private Date confirmed;
}


hintを見てみます。

roo> hint
At this stage of the project, you have a few options:

  * List all hint topics via 'hint topics'
  * Create more fields with 'hint fields'
  * Create more entities with 'hint entities'
  * Create a web controller with 'hint controllers'
  * Create dynamic finders with 'hint finders'
  * Setup your logging levels via 'hint logging'
  * Run tests via Maven (type 'exit' and then 'mvn test')
  * Build a deployment artifact (type 'exit' then 'mvn package')
  * Learn about Eclipse integration by typing 'hint eclipse'
  * Discover all Roo commands by typing 'help'

ここからはアプリケーション毎に色々ですね。

動作確認

では今まで作成したものを動かしてみます。テストケースの作成とコントローラの自動生成を行います。

roo> new integration test
roo> new controller automatic ~.web.RsvpController

では最後にMavenで実行してみましょう。

roo> quit
$ mvn test

あれっ、エラーでる。なんでっ

declare @type is only supported at Java 5 compliance level or above

Java7のベータ版を入れていたからの模様。Java6にして実行したら、

Running com.wedding.domain.RsvpIntegrationTest
Tests run: 9, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.857 sec

Results :

Tests run: 9, Failures: 0, Errors: 0, Skipped: 0

と、テストが成功していることが分かります。

blog1.mammb.com

に続く。