Spring Roo 入門: 第 6 回: Spring Roo 1.2 を使って Spring MVC および GWT アプリケーションを開発し、Cloud Foundry にデプロイする

Spring MVC および GWT アプリケーションの開発およびデプロイを迅速に行う

Spring Roo は、バージョン 1.2 のリリースで大幅に進歩しました。この記事では、マルチモジュール・プロジェクトや MongoDB サポート、JSF サポートをはじめ、この最新リリースにおける数々の新機能を紹介します。その後、Spring Roo を使って実際にマルチモジュール GWT Web アプリケーションを開発し、Cloud Foundry にデプロイする方法を説明します。

Shekhar Gulati, Senior Java Consultant, Xebia

Photo of Shekar GulatiShekhar Gulati は、Xebia India の Java コンサルタントです。これまで 6 年以上、Enterprise Java の経験があり、Spring、Spring-WS、Spring Roo など、一連の Spring プロジェクトに関する幅広い経験を持っています。彼が関心を持っている分野には、Spring、NoSQL データベース、Hadoop、Spring Roo のような RAD フレームワーク、クラウド・コンピューティング (主に Google App Engine、CloudFoundry、OpenShift などの PaaS サービス) などがあります。彼は執筆活動も活発に行っていて、JavaLobby、Developer.com、IBM developerWorks、そして彼自身のブログ (http://whyjava.wordpress.com) などに寄稿しています。Twitter で彼をフォローするには、http://twitter.com/#!/shekhargulati にアクセスしてください。



2012年 10月 04日

Spring リリース 3.1の機能

Spring フレームワークの最新かつ最も優れたリリースである Spring リリース 3.1の機能を詳しく調べてください。

この連載の第 1 回第 2 回では、Spring Roo 1.1 を使ってカンファレンス・アプリケーションを作成しました。第 3 回第 5 回では、Spring Roo のアドオンを開発しました。その間の第 4 回では、Cloud Foundry と Spring Roo の統合について検討しました。第 2 回以降、この 1 年間にわたって Spring Roo に導入された多くの新機能や変更については取り上げていません。また、以前のバージョンで機能していたコマンドのなかには、最新のバージョンで機能しなくなったもの、非推奨になったものもあります。最新バージョンである Spring Roo 1.2 では Spring リリース 3.1 を使用していることも、重要な一面となっています。Spring リリース 3.1 は Spring フレームワークの最新かつ最も優れたリリースで、プロファイル、環境の抽象化、キャッシュの抽象化をはじめ、多くの機能を備えています。Spring Roo の最新バージョンで作業するということは、最新バージョンの Spring フレームワークを使用することを意味します。今回の記事では、最新の Spring Roo バージョン 1.2.1 について簡単に紹介した後、GWT (Google Web Toolkit) と Spring Web MVC (Model–View–Controller) からなるマルチモジュール・アプリケーションを作成して、Cloud Foundry にデプロイします。

Spring Roo 1.2 の紹介

Spring Roo の機能を詳しく調べてください

Spring Roo は、Spring アプリケーションをコマンドラインで迅速に作成するためのアプリケーション開発ツールです。この 1 年で、主要リリース 1.1.5、そして 1.2 と進化してきた Spring Roo は、エンタープライズ開発者が使いやすい、さらに強力なツールになっています。この 2 つのリリースで導入された主要な機能や変更は、以下のとおりです。

  1. MongoDB サポート: Spring Roo のこれまでのバージョンでは、Spring Roo アプリケーションのバックエンドとして RDBMS (MySQL や PostgreSQL など) が必要でした。ただし Google App Engine の BigTable をサポートしている場合は例外です (その場合、リレーションシップでは動作しません)。バージョン 1.2 からは、MongoDB をデータストアとして使用することができます。MongoDB はよく使われているドキュメント指向の NoSQL データストアの 1 つです。Spring MongoDB アプリケーションを作成できるようになったことは、Spring Roo の拡張性を示す好例と言えます。MongoDB 関連のすべてのコマンドを表示するには、以下のコマンドを入力してください。
    help --command mongo
  2. JSF (JavaServer Faces) 2.0 サポート: バージョン 1.2 より前の Spring Roo がデフォルトでビュー・オプションとしてサポートしていたのは、GWT と Spring MVC でした。バージョン 1.2 からは、ビュー・オプションの 1 つとして JSF 2.0 もサポートするようになりました。現在、Spring Roo は Apache MyFaces 実装と Oracle Mojarra JSF実装をサポートし、コンポーネント・ライブラリーとして PrimeFaces をサポートしています。よく知られている JIRA の問題の 1 つが、バージョン 1.2 で解決されたというわけです。JSF に使用できるすべてのコマンドを表示するには、以下のコマンドを入力してください。
    roo> help --command "web jsf" 
    * web jsf all - Create JSF managed beans for all entities  
    * web jsf media - Add a cross-browser generic player to embed multimedia content  
    * web jsf scaffold - Create JSF managed bean for an entity  
    * web jsf setup - Set up JSF environment

    この記事では JSF 2.0 アプリケーションの構築については説明しません。今後の記事で取り上げるかもしれませんが、JSF アプリケーションを構築したいと思っている開発者は、Spring Roo にバンドルされている bikeshop.roo アプリケーションを試してみることができます。サンプル・フォルダーは Roo ディストリビューションに含まれています。

  3. マルチモジュール Maven プロジェクトのサポート: これは、コミュニティーが要望する機能リクエストのなかで最も人気が高かった機能の 1 つで、現在利用できる機能です。バージョン 1.2 でマルチモジュール・プロジェクトがサポートされるようになるまでは、すべてのアプリケーション・コードを 1 つの Maven プロジェクト内で作成しなければならなかったため、エンタープライズ・アプリケーションの構築が制限されていました。エンタープライズ・アプリケーションは、通常サブモジュールで構成され、それぞれのサブモジュールでアプリケーションの懸念 (Web、パーシスタンス、サービスなど) に対処するからです。現在は、親プロジェクトがパーシスタンス、サービス、Web 用に異なるサブモジュールを定義できるようになっています。これについては、後で Spring Roo を使ってマルチモジュール Maven プロジェクトを作成する方法を実践するときに詳しく説明します。
  4. リポジトリーおよびサービス層のサポート: バージョン 1.2 までは、Spring Roo でアプリケーションにリポジトリー (または DAO) およびサービス層を設ける手段はありませんでした。デフォルトで Spring Roo がサポートしていたのは Active Record パターンであり、Active Record パターンによって、あらゆるパーシスタンス関連のメソッドを持つリッチなエンティティー・クラスを提供していました。リポジトリーおよびサービス層のサポートも、コミュニティーから要望があった人気の高い機能の 1 つで、現在利用できる機能です。デフォルトでは、Spring Roo は実装ストラテジーとして引き続き Active Record をサポートしますが、--activeRecord false を指定してエンティティーを作成すれば、Active Record の代わりにリポジトリーを選択することができます。この機能についても、後で詳しく説明します。
  5. リバース・エンジニアリングに対する、より堅牢かつ強力なデータベース・サポート: このアドオンについては第 2 回で取り上げましたが、この 1 年間にわたり、大きな改善が加えられています。改善点をいくつか挙げると、マルチスキーマ・サポート、JNDI (Java Naming and Directory Interface) を介した DBRE からのデータベース接続、リバース・エンジニアリング・ビュー、Active Record エンティティー・オブジェクトに代わるリポジトリーのサポートなどがあります。それに加え、多くのバグも修正されました。DBRE についてはこの記事では説明しませんので、詳細については Spring Roo のドキュメント (「参考文献」を参照) を調べてください。
  6. 改善された Spring Roo アドオン API: 第 5 回では、Spring Roo のアドオンを作成する方法を説明しました。その際に Spring Roo バージョン 1.2 を使用したのは、API に変更が加えられていたためです。バージョン 1.2 より前に存在していたクラスのなかには、バージョン 1.2 では存在しないものや非推奨となったものがあります。Spring Roo チームは、最新の Spring Roo アドオンと対応するように API を変更しているため、アドオンをバージョン 1.2 に更新すると問題になる可能性があります。
  7. 改善された GWT サポート: Spring Roo の GWT サポートは、最新リリースで改善されています。以前は、たった 1 つの gwt setup コマンドだけで、プロキシーの作成から、リクエストの作成、そして他の UI 関連の項目の作成に至るまでのすべてが処理されていました。このコマンドは非推奨となり、現在はリスト 1 に記載する 10 個のコマンドに置き換えられています。GWT については、後で説明します。
    リスト 1. web gwt ヘルプの例
    roo> help --command "web gwt"
    * web gwt all - Locates all entities in the project and creates GWT requests, 
         proxies, and creates the scaffold
    * web gwt gae update - Updates the GWT project to support GAE
    * web gwt proxy all - Locates all entities in the project and creates GWT proxies
    * web gwt proxy request all - Locates all entities in the project and creates GWT 
         requests and proxies
    * web gwt proxy request type - Creates a proxy and request based on 
         the specified type
    * web gwt proxy type - Creates a GWT proxy based on the specified type
    * web gwt request all - Locates all entities in the project and creates GWT requests
    * web gwt request type - Creates a GWT proxy based on the specified type
    * web gwt scaffold - Creates a GWT request, proxy and scaffold for the specified type
    * web gwt setup - Install Google Web Toolkit (GWT) into your project

上述の機能や改善点とは別に、この記事全体をとおしてマイナーな変更点も明らかにします。まずは、新しい Spring Roo 1.2 カンファレンス・アプリケーションを作成するところから始めましょう。


Spring Roo 1.2 の導入

以下の前提条件をダウンロードしてインストールします (「参考文献」を参照)。

  1. Java 6 パッケージ
  2. Apache Maven 3
  3. Spring Roo 1.2 以降

この記事では、現時点での最新リリースである Spring Roo 1.2.1 を使用します。

カンファレンス・アプリケーションを作成する

これから作成するのは、第 1 回と第 2 回で作成したカンファレンス・アプリケーションと同じものです。このアプリケーションでは、1 人の Speaker (講演者) が 1 回以上の Talk (講演) を行うことができます。講演は、1 人の講演者によって行われます。図 1 に、単純なクラス図を示します (Speaker には firstName、lastName、email、organization、birthDate、age、gender が含まれ、Talk には title と description が含まれます)。

図 1. Speaker テーブルと Talk テーブルのクラス図
結合された Speaker テーブルと Talk テーブルを示すスキーマの図

マルチモジュール・プロジェクトを作成する

1 つの Maven プロジェクト内にプロジェクト全体を作成するのではなく、親となる conference プロジェクトを作成し、そこに core と view という 2 つのサブモジュールを含めます。core サブモジュールには、ドメイン、リポジトリー、およびサービス・クラスのすべてを含めます。view サブモジュールは POM (Project Object Model) プロジェクトにして、MVC と GWT という 2 つのサブモジュールを含めます。MVC プロジェクトは Spring MVC アプリケーションを、GWT プロジェクトは GWT アプリケーションを収容します。カンファレンス・アプリケーションには 2 つの UI があります。1 つは Spring MVC ベースの UI、もう 1 つは GWT ベースの UI です。図 2 に、このプロジェクトの構造を示します。

図 2. Maven プロジェクトの構造
Maven プロジェクトのファイル構造を示す画面のスクリーン・キャプチャー

図 2 に示されている構造は、多数のサブモジュールからなるエンタープライズ・アプリケーションに似ています。このアプリケーションを、これから Spring Roo を使って作成します。

  1. オペレーティング・システムのコマンドライン・シェルを開きます。
  2. mkdir コマンドを使用して、conference という名前のディレクトリーを作成します。
  3. シェルで conference ディレクトリーに移動します。
  4. roo」と入力します。このコマンドによって、Roo シェルが立ち上がります。
  5. Roo シェルで最初に入力するコマンドは、project コマンドです。バージョン 1.2 では、このコマンドが POM プロジェクトをサポートするように更新されています。POM プロジェクト自体にはコードは含まれず、pom.xml ファイルがあるだけです。これらのプロジェクトをパッケージ化すると、JAR や WAR ではなく、POM になります。以下のコマンドを入力して、conference POM プロジェクトを作成してください。
    project --topLevelPackage org.xebia.conference --projectName conference 
            --java 6  --packaging POM

    上記のコマンドは、第 1 回で使用した project コマンドとよく似ていて、違う点は 1 つしかありません。それは、packaging という属性が追加されている点です。packaging 属性は、BUNDLE、JAR、POM、WAR のいずれか 1 つの値を取ります。親プロジェクトの場合、この属性の値は POM となります。さらに、バージョン 1.2 からは project コマンドで、parent という名前の属性も使用できるようになっています。名前からわかるように、別の POM を継承する POM プロジェクトには、parent 属性を使用します。この属性の使用法については、サブモジュールを作成するときに紹介します。上記のコマンドによって生成された pom.xml ファイルを表示して、pom.xml に packaging として POM が指定されていることを確認してください。

  6. conference POM プロジェクトを作成したら、次は module コマンドを使用して、core サブモジュールと view サブモジュールを作成します。module コマンドは project コマンドと似ていますが、このコマンドによって作成されるのは Maven プロジェクトではなく、Maven モジュールです。core モジュールを作成するには、以下のコマンドを入力します。
    module create --moduleName core --topLevelPackage org.xebia.conference.core 
         --parent org.xebia.conference:conference:0.1.0.BUILD-SNAPSHOT

    module create コマンドには、moduleName および topLevelPackage という 2 つの必須の属性を指定する必要があります。moduleName 属性を使用してモジュールの名前を指定し、topLevelPackage 属性を使用してモジュールのパッケージ名を指定します。topLevelPackage は、このモジュールの groupId としても使用されます。これらの必須属性とは別に、以下の 3 つのオプション属性があります。

    • –-java: Java のバージョンを指定します。
    • --packaging: モジュールの Maven パッケージ化を指定します。
    • --parent: このモジュールが他の Maven プロジェクトを継承するかどうかを指定します。

    上記に示されているコマンドでは、core モジュールが conference プロジェクトを継承しています。parent 属性は、groupId:artifactId:version という形で値を取ります。これらの値は、conference/pom.xml ファイルから取得することができます。core モジュールの pom.xml ファイルを見ると、このモジュールには parent タグが設定されていることがわかります (リスト 2 を参照)。

    リスト 2. pom.xml ファイルの parent セクション
       <parent> 
            <groupId>org.xebia.conference</groupId> 
            <artifactId>conference</artifactId> 
            <version>0.1.0.BUILD-SNAPSHOT</version> 
        </parent>

    また、親プロジェクトの pom.xml (conference/pom.xml) を調べると、module タグの中で core モジュールが指定されているはずです ( リスト 3 を参照)。
    リスト 3. pom.xml ファイルの module セクション
    <modules> 
       <module>core</module> 
    </modules>
  7. 続いて、view サブモジュールの作成に取り掛かります。ただし、このサブモジュールを作成する前に、以下の module focus コマンドを使用してルート・プロジェクトにフォーカスを戻す必要があります。
    module focus --moduleName ~

    チルダ (~) は、ルート・プロジェクトを指定します。オプションで、Maven プロジェクトまたは Maven モジュールの名前を入力することもできます。例えば、以下のコマンドを使用すると、core プロジェクトに切り替えたのと同じ結果が実現されます。

    module focus --moduleName core
  8. ここで view モジュールを作成します。このモジュールは POM プロジェクトにして、2 つのサブモジュール、MVC と GWT を含めます。view モジュールを作成するには、以下のコマンドを入力します。
    module create --moduleName view --topLevelPackage org.xebia.conference.view 
         --packaging POM --java 6
  9. GWT および MVC サブモジュールを作成するには、リスト 4 のコマンドを実行します。
    リスト 4. GWT および MVC を作成する
    module create --moduleName gwt --topLevelPackage org.xebia.conference.view.gwt 
       --java 6 --parent org.xebia.conference.view:view:0.1.0.BUILD-SNAPSHOT 
    
    module focus --moduleName view 
    
    module create --moduleName mvc --topLevelPackage org.xebia.conference.view.mvc
       --java 6 --parent org.xebia.conference.view:view:0.1.0.BUILD-SNAPSHOT

以上の 9 つのステップによって、core、view、GWT、MVC という4 つのサブモジュールからなるマルチモジュール・プロジェクトが出来上がります。GWT と MVC は、view サブモジュールのサブモジュールです。この時点で Roo シェル内から perform package コマンドを実行すると、すべてのサブモジュールが完全にビルドされます。

パーシスタンスを追加する

Maven モジュール構造は作成できたので、次はパーシスタンスのサポートを追加します。パーシスタンス関連の構成をセットアップするには、JPA (Java Persistence API) の setup コマンド (jpa setup) を使用します。persistence setup コマンドは非推奨となっているので、persistence setup コマンドの使用はお勧めしません。persistence setup コマンドが非推奨となった理由は、Spring Roo は現在、タイプの異なる永続データストア・ソリューション (RDBMS など) とドキュメント指向データストア (MongoDB など) をサポートするようになっているためです。persistence setup は、どちらかというと汎用的な名前であるため、今後、Spring Roo が Cassandra などの他の NoSQL データベースのサポートを追加することにした場合には、Cassandra などのセットアップにこのコマンドが使用されることが見込まれます。パーシスタンスのサポートをアプリケーションに追加するには、リスト 5 のコマンドを入力します。パーシスタンスのサポートを追加する対象は core モジュールなので、最初に module focus コマンドを使用して core モジュールに切り替えてください。

リスト 5. パーシスタンスのサポートを追加するためのコマンド
module focus --moduleName core 
jpa setup --database DERBY_EMBEDDED --provider HIBERNATE

Spring Roo は現在、15 のデータベースをサポートしているため、その中から目的のデータベースを選択できるはずです。jpa setup コマンドには、persistence setup コマンドと同じように、database および provider という 2 つの必須属性があります。後者は、Hibernate などの JPA プロバイダー、あるいは Google App Engine の場合は Datanucleus です。残りの属性は、persistence コマンドで今まで使用されていたものと同じなので説明は省略します。

Roo シェルをクリアする

以前は、clear コマンドまたは cls コマンドで Roo シェルをクリアしようとしていたかもしれませんが、現在、オペレーティング・システムのコマンドを実行するには、「! <os command>」と入力します。したがって、コマンドをクリアするには以下のように入力することになります。

core roo> ! clear

Speaker および Talk エンティティーを作成する

この時点で hint コマンドを入力すると、エンティティーを作成するように指示が出されます。entity コマンドは、MongoDB エンティティーと区別するために、entity jpa コマンドに変更されました。MongoDB エンティティーを作成する場合は、entity mongo コマンドを使用します。entity コマンドでのもう 1 つの大きな変更点は、Active Record エンティティーを生成するかどうかを選択できるようになったことです。この記事では Active Record エンティティーではなく、リポジトリーを使用します。Speaker および Talk エンティティーを作成するには、リスト 6 のコマンドを入力します。

リスト 6. エンティティーを作成する
entity jpa --class ~.domain.Speaker --testAutomatically 
     --activeRecord false --serializable 
entity jpa --class ~.domain.Talk --testAutomatically 
     --activeRecord false –serializable

リスト 6 では、Roo に対し、activeRecord エンティティーを生成しないように明示的に指示しています。デフォルトのメカニズムは今でも activeRecord であるため、--activeRecord false を指定しなければ、Active Record エンティティーが生成されることになります。

エンティティーにフィールドを追加する

field コマンドは今までと同じで、その構文は何も変更されていません。リスト 7 のコマンドを入力して、各エンティティー・クラスにフィールドを追加してください。

リスト 7. エンティティー・クラスにフィールドを追加する
field string --fieldName firstname --class ~.domain.Speaker --notNull 
field string --fieldName lastname --notNull 
field string --fieldName email --class ~.domain.Speaker --unique --notNull --regexp 
     ^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})
field string --fieldName organization 
field date --fieldName birthdate --type java.util.Date --past --notNull 
field number --type java.lang.Long --fieldName age --min 25 --max 60 
field date --fieldName created --type java.util.Date --notNull 
field string --fieldName title --class ~.domain.Talk --notNull 
field string --fieldName description --notNull --sizeMax 4000 
field date --fieldName created --type java.util.Date --notNull 
field set --fieldName talks --type ~.domain.Talk --class ~.domain.Speaker 
     --cardinality ONE_TO_MANY 
field reference --fieldName speaker --type ~.domain.Speaker --class ~.domain.Talk 
     --notNull

email フィールドでは正規表現を使用していることに注意してください。これにより、email フィールドが正規表現と照合されます。また、created という名前のフィールドにも注意が必要です。名前が created で日付型のフィールドを更新することはできません。YouThis はマイナーな拡張ですが、役に立ちます。リスト 8 のコード・スニペットでは、列アノテーション内で updatable 属性の値が false に設定されています。

リスト 8. updatable が false に設定された例
@NotNull 
@Column(updatable = false) 
@Temporal(TemporalType.TIMESTAMP) 
@DateTimeFormat(style = "M-") 
private Date created = new Date();

リポジトリーおよびサービス層を追加する

Spring JPA および Spring Data の詳細を調べてください

Spring Roo コミュニティーは ActiveRecord パターンに代わる手法を要望していました。それは、エンタープライズ・アプリケーションではリポジトリーおよびサービス層を使用するほうが一般的であり、開発者にとってはそのほうが慣れているためです。Spring Roo 1.2 は、リポジトリーの使用を可能にするために、Spring JPA プロジェクトを利用しています。Spring JPA は、JPA ベースのリポジトリーの実装を容易にする Spring Data アンブレラ・プロジェクトの一部です。Spring Roo で Spring JPA リポジトリーを使用する場合、リポジトリーのインターフェースを作成するだけで、Spring JPA がこれらのインターフェースを実装してくれます。また、基本的な CRUD 操作とは別に、カスタム finder メソッドの追加もサポートされています。finder メソッドをリポジトリーのインターフェースに定義するには、以下のようにします。

List<Person> findPersonByNameAndCountry(String name, String country)

Spring JPA は、メソッドの名前を分解してこのメソッドを実装し、指定された名前と国を持つすべての Person のリストを返します。Spring JPA を使用すると、コードの量は減りますが、メソッド名は常にエンティティーのプロパティーと一致しなければならないことに注意してください。Person クラスに name プロパティーまたは country プロパティーがなければ、メソッドは正常に動作しません。この記事では Spring Data JPA プロジェクトについては説明しませんが、このプロジェクトのドキュメントを読むことをお勧めします。

Speaker および Talk エンティティーのリポジトリー・インターフェースを追加するには、リスト 9 のコマンドを入力します。

リスト 9. リポジトリー・インターフェースを追加する
repository jpa --interface ~.repository.SpeakerRepository --entity ~.domain.Speaker 
repository jpa --interface ~.repository.TalkRepository --entity ~.domain.Talk

repository jpa コマンドには 2 つの属性があります。1 つはインターフェースの名前、もう 1 つはリポジトリーを作成する対象のエンティティーです。上記の例では、Speaker エンティティーを対象に、com.xebia.conference.core.repository パッケージ内に SpeakerRepository を作成するように指定しています。Talk エンティティーにも、同じように指定しました。リスト 10 のコマンド出力を見ると、このコマンドによって pom.xml に spring-data-jpa 依存関係が追加され、SpeakerRepository.java インターフェースとそれに対応する SpeakerRepository_Roo_Jpa_Repository.aj ITD ファイルが作成されていることがわかります。

リスト 10. 出力例
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/repository 
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/repository/SpeakerRepository.java 
Created core|SPRING_CONFIG_ROOT/applicationContext-jpa.xml 
Updated core|ROOT/pom.xml 
             [added dependency org.springframework.data:spring-data-jpa:1.0.2.RELEASE] 
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/repository/
                                       SpeakerRepository_Roo_Jpa_Repository.aj
Created core|SRC_TEST_JAVA/org/xebia/conference/core/domain/
                                       SpeakerDataOnDemand_Roo_DataOnDemand.aj 
Created core|SRC_TEST_JAVA/org/xebia/conference/core/domain/
                                       SpeakerIntegrationTest_Roo_IntegrationTest.aj

repository jpa コマンドによって生成される成果物のなかで、最も興味深いのは *Repository_Roo_Jpa_Repository.aj ITD です。ITD (Inter-Type Declaration: 型間宣言) ファイルには、リスト 11 に記載する 3 つの宣言が含まれます。

リスト 11. ITD ファイル内の宣言
privileged aspect SpeakerRepository_Roo_Jpa_Repository { 

 declare parents: SpeakerRepository extends JpaRepository<Speaker, Long>; //1
    
 declare parents: SpeakerRepository extends JpaSpecificationExecutor<Speaker> ; //2
    
 declare @type: SpeakerRepository: @Repository; //3
    
}

宣言の最初の行では、SpeakerRepository インターフェースは JpaRepository インターフェースを継承する必要があることを宣言しています。JpaRepository インターフェースには、すべての CRUD メソッドとその他の commons メソッドが含まれます。2 行目では、SpeakerRepository インターフェースは JpaSpecificationExecutor インターフェースを継承する必要があることを宣言しています。このインターフェースでは、JPA 基準 API に基づく仕様を実行することができます。最後の行である 3 行目では、SpeakerRepository インターフェースが @Repository アノテーションを確実に使用するための宣言をしています。

サービス層を追加する

リポジトリーを使用している場合、サービス層を設けなければならないわけではありませんが、大抵のシナリオでは、サービス層にすべてのビジネス・ロジックを含めるようにするのが妥当です。Roo が生成する CRUD アプリケーションから離れ始めると、サービス・クラスが必要であることがわかってきます。したがって、エンティティー・クラスにはサービス・クラスを作成するのが妥当です。Speaker および Talk エンティティーのサービスを作成するには、Roo シェルでリスト 12 のコマンドを実行します。

リスト 12. サービスを作成する
service --interface ~.service.SpeakerService --entity ~.domain.Speaker 
service --interface ~.service.TalkService --entity ~.domain.Talk

SpeakerService に対する service コマンドによって、リスト 13 の出力が生成されます。

リスト13. SpeakerService による出力
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/service 
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/service/SpeakerService.java
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/service/SpeakerServiceImpl.java
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/service/
                                       SpeakerService_Roo_Service.aj
Updated core|SRC_TEST_JAVA/org/xebia/conference/core/domain/
                                       SpeakerDataOnDemand_Roo_DataOnDemand.aj
Updated core|SRC_TEST_JAVA/org/xebia/conference/core/domain/
                                       SpeakerIntegrationTest_Roo_IntegrationTest.aj
Created core|SRC_MAIN_JAVA/org/xebia/conference/core/service/
                                       SpeakerServiceImpl_Roo_Service.aj

サービス・フォルダーが作成されて、テスト・クラスが変更された他、このコマンドによって SpeakerService、SpeakerServiceImpl 実装、そして SpeakerService_Roo_Service.aj および SpeakerServiceImpl_Roo_Service.aj という 2 つの ITD が作成されました。SpeakerService_Roo_Service.aj は、SpeakerService インターフェースの ITD であり、SpeakerService インターフェースにすべての必要なメソッド宣言が含まれることを確実にします。SpeakerServiceImpl_Roo_Service.aj には、SpeakerService_Roo_Service.aj ITD に定義された実装メソッドが含まれ、コンパイル時にこれらの実装のすべてを SpeakerServiceImpl クラスに追加します。

これで、core モジュールには、この記事に必要なすべてのコードが揃ったことになります。次は、Spring Roo を使用して GWT と MVC の UI を作成します。

GWT ユーザー・インターフェースを作成する

GWT (Google Web Toolkit) は、Java プログラミング言語で複雑かつリッチな JavaScript アプリケーションを作成するためのオープンソースの開発ツールキットです (「参考文献」を参照)。GWT により、Java 開発者は複雑な Ajax 対応の Web アプリケーションを、Java コードでコードを作成するかのように簡単に作成することができます。しかも、GWT はコードをコンパイルして極めて最適化された JavaScript を生成します。

Spring Roo は、ドメイン・モデルから GWT アプリケーションの基礎を生成するためのサポートを提供します。

以前のリリースでは、gwt setup という 1 つのコマンドによって、GWT のセットアップからエンティティーのビューの作成、そして Google App Engine との適合性の確認までのすべてが処理されていました。現在、gwt setup コマンドは 10 種類のコマンドに分割され、開発者がより細かく制御できるようになっています。リスト 14 に、これらのコマンドを記載します。

リスト 14. web gwt のヘルプ出力
view/gwt roo> help --command "web gwt" 
* web gwt all - Locates all entities in the project and creates GWT requests, proxies 
     and creates the scaffold 
* web gwt gae update - Updates the GWT project to support GAE 
* web gwt proxy all - Locates all entities in the project and creates GWT proxies 
* web gwt proxy request all - Locates all entities in the project and creates GWT 
     requests and proxies 
* web gwt proxy request type - Creates a proxy and request based on the specified type 
* web gwt proxy type - Creates a GWT proxy based on the specified type 
* web gwt request all - Locates all entities in the project and creates GWT requests 
* web gwt request type - Creates a GWT proxy based on the specified type 
* web gwt scaffold - Creates a GWT request, proxy and scaffold for the specified type
* web gwt setup - Install Google Web Toolkit (GWT) into your project

ドメイン・モデルの GWT フロントエンドを作成する場合に必要なコマンドは、web gwt setup と web gwt all の 2 つです。その他のコマンドは、以下の目的で使用します。

  • UI の基礎を生成しない場合に、プロキシー、リクエスト、またはリクエストとプロキシーの両方を作成する
  • プロキシー、リクエスト、またはリクエストとプロキシーの両方を作成し、加えて UI の基礎を生成する
  • Google App Engine をサポートするように GWT プロジェクトを更新する

この記事で取り上げるのは、web gwt setup と web gwt all だけです。この 2 つのコマンドがどのように機能するのかを把握していれば、他のコマンドも容易に使用することができます。

GWT プロジェクトをセットアップする

Spring Roo が現在従っている規約では、すべてのビュー・アドオン (GTW、MVC、JSF など) が setup コマンドを持つことになります。setup コマンドの役目は、必要な Maven 依存関係、構成ファイル、ダミー・クラスを追加して、ビュー技術に必要なフォルダー構造を作成することです。GWT プロジェクトをセットアップするには、リスト 15 のコマンドを入力します。このリストには、コマンドの出力も記載されています。

リスト 15. web gwt setup による出力例
view/gwt roo> web gwt setup 

Created view/gwt|ROOT/src/main/webapp/WEB-INF/spring 
Created view/gwt|ROOT/src/main/webapp/WEB-INF/spring/webmvc-config.xml 
Created view/gwt|ROOT/src/main/webapp/WEB-INF/web.xml 
Updated view/gwt|ROOT/src/main/webapp/WEB-INF/spring/webmvc-config.xml 
Created view/gwt|SRC_MAIN_JAVA/org/xebia/conference/view/gwt 
Created view/gwt|SRC_MAIN_JAVA/org/xebia/conference/view/gwt/App.gwt.xml 
Created view/gwt|SRC_MAIN_JAVA/org/xebia/conference/view/gwt/client 
Created view/gwt|SRC_MAIN_JAVA/org/xebia/conference/view/gwt/client/AppEntryPoint.java 
Updated view/gwt|ROOT/src/main/webapp/WEB-INF/web.xml 
Updated view/gwt|ROOT/pom.xml 
   [added dependencies org.springframework:spring-webmvc:${spring.version}, 
   org.springframework.webflow:spring-js-resources:2.2.1.RELEASE, 
   commons-digester:commons-digester:2.1, commons-fileupload:commons-fileupload:1.2.2, 
   javax.servlet.jsp.jstl:jstl-api:1.2, org.glassfish.web:jstl-impl:1.2, 
   javax.el:el-api:1.0, joda-time:joda-time:1.6, javax.servlet.jsp:jsp-api:2.1, 
   commons-codec:commons-codec:1.5; updated project type to war; 
   added repository http://maven.springframework.org/external; 
   added dependencies com.google.gwt:gwt-servlet:2.4.0, com.google.gwt:gwt-user:2.4.0, 
   org.json:json:20090211, com.google.gwt.inject:gin:1.5.0, 
   javax.validation:validation-api:1.0.0.GA, 
   javax.validation:validation-api:1.0.0.GA:sources, xalan:xalan:2.7.1; 
   added plugin org.codehaus.mojo:gwt-maven-plugin:2.2.0; 
   added plugin org.codehaus.mojo:exec-maven-plugin:1.2]

上記の出力には、このコマンドによってテンプレート GWT プロジェクトが作成されたことが示されています。プロジェクトの構成内容は、必要な Maven 依存関係とプラグイン、サンプル AppEntryPoint クラス、サンプル GWT モジュール App.gwt.xml、そしてすべての Web アプリケーションに必要な web.xml です。web gwt setup コマンドは何も特別なことを実行しないので、web gwt all コマンドに話題を移しましょう。ドメインの GWT UI の基礎を生成するには、以下のコマンドを実行します。

web gwt all --proxyPackage ~.client.proxy --requestPackage ~.client.request

web gwt all コマンドは大変な作業をすべて行い、GWT モジュール・デプロイメント記述子 ApplicationScaffold.gwt.xml、GWT エントリー・ポイントとなる Scaffold.java、Proxy クラスの SpeakerProxy と TalkProxy、Speaker エンティティーと Talk エンティティーの各種 Activity クラス、Speaker と Talk の RequestFactory クラス、そして各種 Place クラスを作成します。

以下のコマンドを入力して、GWT プロジェクトの log4j ロギングをセットアップします。

logging setup --level INFO

シェルを終了するには、「q」または「quit」と入力します。これらのコマンドによって、完全に機能する GWT フロントエンド・カンファレンス・アプリケーションが作成されます。

このアプリケーションを実行するには、コマンドラインからカレント・ディレクトリーを gwt に変更し、「mvn gwt:run」と入力します (これにより、jetty サーバーが起動され、GWT 開発モードが開始されます)。デフォルトのブラウザーにアプリケーションを開くには、「Launch Default Browser (デフォルト・ブラウザーの起動)」をクリックします。あるいは、URL をクリップボードにコピーして、別のブラウザーにアプリケーションを開きます。

アプリケーションは http://127.0.0.1:8888/ApplicationScaffold.html?gwt.codesvr=127.0.0.1:9997 で実行され、図 3 に示す画面が表示されます。「Talks (講演)」または「Speakers (講演者)」をクリックすると、すべての講演またはすべての講演者が表示されます。

図 3. GWT アプリケーションを実行する
ブラウザーで実行中の GWT アプリケーションのスクリーン・キャプチャー

Spring MVC ユーザー・インターフェースを作成する

このセクションでは、今回の記事で作成したドメイン・モデルの Spring MVC Web ビューを作成する方法を簡単に説明します。第 1 回で説明した「controller all」コマンドは、現在では非推奨となっているため、このコマンドの使用はお勧めしません。新しいコマンドを使用する前に、mvc モジュールにフォーカスを移してください。それには、Roo シェルで以下のコマンドを入力します。

module focus --moduleName view/mvc

Spring Roo の新しい setup コマンドは、Spring MVC アプリケーションのセットアップに関連するすべての構成を行います。コントローラーの基礎を生成したい場合や、単純にセットアップだけを行いたい場合には、このコマンドを実行することで、コントローラーを生成する準備が整います。アプリケーションに Spring MVC をセットアップする場合のコマンドは、以下のとおりです。

view/mvc roo> web mvc setup

このコマンドによって Spring webmvc-config.xml コンテキスト・ファイルの追加に関連するセットアップが行われ、Maven 依存関係、静的リソース・ファイル、Spring Roo タグ・ライブラリーが追加されたことがこのコマンドの出力に示されます。エンティティーのビューは、このコマンドでは作成されません。これは、エンティティーのビューを必要としない開発者にとって有用なことです。手動でコントローラーを作成して、RESTful な Web サービスを公開することができます。

カンファレンス・アプリケーションの基本的なセットアップが完了したら、次はエンティティーのコントローラーとビューを作成します。以下のコマンドを入力してください。

view/mvc roo> web mvc all --package ~.web

web mvc all コマンドは、すべてのエンティティーのコントローラーと jspx ビューを生成します。単一エンティティーの基礎を生成する場合は、web mvc scaffold コマンドを使用して、エンティティーの名前とコントローラーの完全修飾名を指定します。リスト 16 に、その他多くの web mvc コマンドを記載します。これらのコマンドの一部は第 2 回で紹介したので、ここではすべての web mvc コマンドを網羅してはいません。

リスト 16. web mvc のヘルプ出力
view/mvc roo> help --command "web mvc" 
* web mvc all - Scaffold Spring MVC controllers for all project entities 
     without an existing controller 
     * web mvc controller - Create a new manual Controller (where you write the methods)
* web mvc embed document - Embed a document for your WEB MVC application 
* web mvc embed generic - Embed media by URL into your WEB MVC application 
* web mvc embed map - Embed a map for your WEB MVC application 
* web mvc embed photos - Embed a photo gallery for your WEB MVC application 
* web mvc embed stream video - Embed a video stream into your WEB MVC application 
* web mvc embed twitter - Embed twitter messages into your WEB MVC application 
* web mvc embed video - Embed a video for your WEB MVC application 
* web mvc embed wave - Embed Google wave integration for your WEB MVC application 
* web mvc finder add - Adds @RooWebFinder annotation to MVC controller type 
* web mvc finder all - Adds @RooWebFinder annotation to existing MVC controllers 
* web mvc install language - Install new internationalization bundle for MVC 
     scaffolded UI.
* web mvc install view - Create a new static view. 
* web mvc json add - Adds @RooJson annotation to target type 
* web mvc json all - Adds or creates MVC controllers annotated with @RooWebJson 
     annotation 
* web mvc json setup - Set up Spring MVC to support JSON 
* web mvc language - Install new internationalization bundle for MVC scaffolded UI. 
* web mvc scaffold - Create a new scaffold Controller (that is where Roo maintains CRUD 
     functionality automatically) 
* web mvc setup - Setup a basic project structure for a Spring MVC / JSP application 
* web mvc update tags - Replace an existing application tagx library with the latest 
     version (use --backup option to backup your application first) 
* web mvc view - Create a new static view.

Cloud Foundry にデプロイする

ここまででカンファレンス・アプリケーションの作成は完了したので、次は当然、このアプリケーションをデプロイします。Spring アプリケーションを Cloud Foundry パブリック・クラウドにデプロイする上で、アプリケーションに必要な変更は何もありません。Cloud Foundry については、第 4 回で詳しく説明しました。その際に、Roo シェル内から Spring Roo Cloud Foundry アドオンを使って Spring Roo アプリケーションをデプロイする方法についても説明しましたが、リリース 1.2.1 では、このサポートが上手く機能しないようです。したがって、今回の記事では vmc ruby gem を使用して、カンファレンス・アプリケーションを Cloud Foundry にデプロイします。以下の手順に従ってください。

  1. vmc クライアントをインストールします。「Installing the Command-Line Interface (vmc)」というタイトルのステップバイステップのチュートリアルについては、「参考文献」を参照してください。
  2. Cloud Foundry に登録したクレデンシャルを使用して、Cloud Foundry パブリック・クラウドにログインします。vmc login コマンドを入力すると、e-メールとパスワードを入力するように指示されます (リスト 17 を参照)。
    リスト 17. vmc login の例
    shekhar@shekhar:~/dev/conference/view/mvc/target$ vmc login 
    Attempting login to [http://api.cloudfoundry.com] 
    Email: shekhargulati84@gmail.com 
    Password: ************* 
    Successfully logged into [http://api.cloudfoundry.com]
  3. vmc クライアントをインストールした後、カンファレンス・アプリケーション全体の Maven ビルドを行う必要があります。それには、以下のコマンドを入力します。
    mvn clean install
  4. プロジェクトをビルドしたら、カンファレンス・アプリケーションを Cloud Foundry にプッシュします。この記事では、Spring MVC 版と GWT 版の 2 つのアプリケーションをプッシュします。Spring MVC カンファレンス・アプリケーションをプッシュするには、conference/view/mvc/target フォルダーに移動して、リスト 18 に示す vmc push を入力します。
    リスト 18. Spring MVC アプリケーションをプッシュする例
    shekhar@shekhar:~/dev/conference/view/mvc/target$ vmc push  
    Would you like to deploy from the current directory? [Yn]: Y 
    Application Name: mvcconference  
    Application Deployed URL [mvcconference.cloudfoundry.com]:  
    Detected a Java SpringSource Spring Application, is this correct? [Yn]: Y  
    Memory Reservation (64M, 128M, 256M, 512M, 1G) [512M]:  
    Creating Application: OK  
    Would you like to bind any services to 'mvcconference'? [yN]: N  
    Uploading Application:  
    Checking for available resources: OK  
    Processing resources: OK  
    Packing application: OK  
    Uploading (91K): OK  
    Push Status: OK  
    Staging Application: OK  
    Starting Application: OK

    Cloud Foundry vmc クライアントは、アプリケーションの名前、アプリケーションのタイプ、デプロイ先の URL、メモリーの割当量、およびサービスをバインドするかどうかについての情報をユーザーから取得すると、アプリケーションを Cloud Foundry にアップロードしてデプロイします。http://mvcconference.cloudfoundry.com/ にアクセスすると、実行中の Spring MVC アプリケーションが表示されます。

  5. 今度は GWT アプリケーションを Cloud Foundry にプッシュします。conference/view/gwt/target フォルダーに切り替えて、リスト 19 に示すように「vmc push」と入力します。
リスト 19. GWT アプリケーションをプッシュする例
shekhar@shekhar:~/dev/conference/view/gwt/target$ vmc push 
Would you like to deploy from the current directory? [Yn]: Y 
Application Name: gwtconference 
Application Deployed URL [gwtconference.cloudfoundry.com]: 
Detected a Java SpringSource Spring Application, is this correct? [Yn]: Y 
Memory Reservation (64M, 128M, 256M, 512M) [512M]: 
Creating Application: OK 
Would you like to bind any services to 'gwtconference'? [yN]: N 
Uploading Application: 
  Checking for available resources: OK 
  Processing resources: OK 
  Packing application: OK 
  Uploading (5M): OK   
Push Status: OK 
Staging Application: OK                                                         
Starting Application: OK

実行中のアプリケーションを表示するには、http://gwtconference.cloudfoundry.com/ にアクセスします。

カンファレンス・アプリケーションのソース・コードをダウンロードしてください。


まとめ

今回の記事では、Spring Roo を再度紹介しました。Spring Roo 1.2 で導入されたマルチモジュール Maven プロジェクトや、リポジトリーおよびサービス層などの新機能について説明した後、Roo 1.2 を使用して、いくつかの新機能を統合したアプリケーションを作成しました。さらに、Spring Roo を使って GWT アプリケーションを作成する方法を説明し、最後に Spring MVC アプリケーションと GWT アプリケーションを Cloud Foundry にデプロイしました。今回は、JSF サポートや MongoDB サポートなどの新機能についてのレビューはしていません。

連載の第 7 回では、Spring Roo を使って Spring MongoDB アプリケーションを作成し、Cloud Foundryにデプロイする方法を説明します。


ダウンロード

内容ファイル名サイズ
Sample codeconference.zip340KB

参考文献

学ぶために

製品や技術を入手するために

  • プロジェクトの Web サイトから Java 6 製品をダウンロードしてください。
  • プロジェクトの Web サイトから Apache Maven 3 をダウンロードしてください。
  • プロジェクトの Web サイトから Spring Roo 1.2 以降をダウンロードしてください。
  • Google Web Toolkit プロジェクトのホーム・ページで GWT の詳細を調べてください。
  • CloudFoundry パブリック・クラウドに登録してください。
  • IBM 試用版ソフトウェアを使用して、開発者専用のソフトウェアを使って次のオープンソース開発プロジェクトを革新してください。IBM 試用版ソフトウェアは、ダウンロードまたは DVD で入手できます。

議論するために

  • 他の developerWorks ユーザーとのつながりを持つと同時に、開発者によるブログ、フォーラム、グループ、ウィキを調べてください。developerWorks コミュニティーで、Real world open source グループの構築を手伝ってください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Java technology
ArticleID=838101
ArticleTitle=Spring Roo 入門: 第 6 回: Spring Roo 1.2 を使って Spring MVC および GWT アプリケーションを開発し、Cloud Foundry にデプロイする
publish-date=10042012