ラベル Spring Roo の投稿を表示しています。 すべての投稿を表示
ラベル Spring Roo の投稿を表示しています。 すべての投稿を表示

2012年12月8日土曜日

Spring Rooをdisる

日本にはSpring Userがたくさんいるはずなんですが、

『Spring Framework Advent Calendar 2012』

知っている人がすくないのか、

職業PGのためSpringがよくわかってない人が多いのか、

なんなのかわかりませんが、2巡目書きます。

なお、昨日は@two_packさんのエントリーでした(2巡目)。


本日のお題


前回はSpring Rooを持ち上げたので、

今日はSpring Rooをこき下ろします。


IDEの導入


さて、皆さんJavaで開発する場合はIntelliJ IDEAを使っていると思いますが、

Eclipseで開発したい人も居ますよね。

まあ、そういう人は次の書籍を読んで、

Spring Rooプロジェクトを取り込む方法を

探して下さい。





IntelliJ IDEAではpom.xmlをそのまま取り込むことができるので、

Spring Rooが自動的に生成したpom.xmlを読み込むことができます。


IntelliJ IDEAをたちあげて、「Open Project」を選択します。




つぎに、Spring Rooが生成したpom.xmlを開きます。




すると、プロジェクトが自動的に開きます。





さて、この画面が表示された後に、

SpringとJPAのフレームワークが検出されたというメッセージが表示されるので、

設定してあげて下さい。


設定方法は、OKボタンを押すだけです。


disりますよ


Spring Rooというのはプログラミングレスと前回言いましたが、

本当はプログラミングが必要です。


一応、Spring RooはGrailsと違って、Java知っているだけで出来ますよってのがウリです。

でも、生成されたソースを見ると、

AspectJだらけです。






もし、何かしら特殊なことがやりたかったら、

push inする必要があります。


そのあたりはこの辺のエントリーを見て下さい。



プログラミングレスおじさん


某私が前の前の会社にいた時に、

いたんですね。プログラミングレスおじさん。


そんなおじさんにJavaなんて言おうものなら、

稟議を却下されます。


AspectJなんて言ったら、

多分「なんだそれは、どこかの会社の変なフレームワークじゃないのか?」と

稟議が却下されます。


そんな状況で、Spring rooはプログラミングレスでいいですよ

なんて言ったら、稟議が通りますが、

その後にAspectJのプッシュインとかで、

AspectJを知らない職業プログラマーが泣きを見ることは

必至です。


だから、AspectJを知らないプログラマーがいる場合は、

Spring Rooを使わないようにしましょう。



はて


明日の『Spring Framework Advent Calendar 2012』は、誰ですかね…


う~ん、代打オレといきたいけど、ちょっと今日は用事があるので、誰かおねがいします。




2012年12月2日日曜日

今更Spring Rooを紹介しる

10月くらいから冬眠し始めて、気付いたら12月になってました。

みけです。


本題


12月といったらAdvent Calendarということで、

このエントリーは「Spring Framework Advent Calendar 2012」の二日目となります。

なお昨日、つまりトップバッターは@makingさんで、

STSでSpringMVC+SpringDataJPA+HibernateなPre-Configuredテンプレートプロジェクトをクイックスタート! #jsug」でした。


Spring Roo


まあ、僕は結構めんどうくさがりなので、

pom.xmlとか書くのが嫌だし、

Springの他にHibernateとかの設定をするのも

まあ、正直面倒だと思ったりするわけです。


で、二~三年くらい前に初めてSpring Rooを知ったときは、

うわ、めっちゃ楽そうやん!と衝撃を覚えたものです。


というわけで、Spring Rooの紹介をしたいと思います。


Get Started


Spring Rooのサイトに行ってダウンロードして、

パスを通すだけです。

今回はWindowsでやっていますが、Macでも変わりありません。

roo とコマンドを打って次のような画面が出れば、

インストール完了です。




至れり尽くせり


さて、何やればいいかわかりませんね。

そういう場合はhintと入力します。




projectコマンドを入力して、

そのうえで、TABを入力してとメッセージが出ます。


そのとおりにやってみましょう。




--topLevelPackageというオプションが自動的に

示唆されました。

ここでは、プロジェクトのパッケージ名を入力してとのことだそうです。


パッケージ名称を入力して、Enterを押します。



おお、なんか出来上がったっぽいですね。

実際に何が出来たか見てみましょう。



  • pom.xml
  • log4j.properties
  • applicationContext.xml

この三つのファイルが出来上がっています。


さて、次に何すればいいのでしょう?

ここでもhintコマンドを入力しましょう!




はい、データベースの設定をしてね、

と指示されます。

JPAかmongDBのどちらかを設定してあげます。


まあ、Spring Advent Calendarということで、

Spring DATAを用いてmongoDBとつなげる的な

エントリーはきっと誰かやってくれるので、

ここでは普通にJPAを選択します。


jpa setup

と入力して、TABを三回入力してねと言われているので、

そのとおりやってみます。




3回押した結果がこれだよ~(´・ω・`)


JPA実装をどれにするのか聞かれます。

まあ、ここは皆さん大好きHibernateにしましょう。

H を入力してTABを押します。




HIBERNATEと補完してくれます。

続いてTABを入力します。




すると我々は、--database オプションの指定を強制されているんだ

って状態になります。

まあ、何を入力すればいいかわからないので、

TABを打ちましょう。




データベースを何にするかを選べという事ですね。

とりあえず、MYSQLかな…

MYまで打ってTABを入力します。




はい、MYSQLと補完してくれました。

次は何を…TABです。





あれ、補完されませんね。

じゃあ、このままENTERを押しちゃいましょう。




お、なんかいろいろアップデートされたみたいですね。




  • persistence.xml
  • database.properties

の二つのファイルが追加されたようです。





とまあ、プロジェクトを始めるにあたって、

hintとTABを押していればなんかプロジェクトが勝手にできてきます。

楽ですね~


実際にアプリケーション作ってみるよ!


引き続きhintを入力します。




あはは、もう、エンティティを作れるよ~!
entと入力して、
--classと出たらエンティティの名前を指定して、
もし、なんかオプションが必要なら--を入力して、
TABを押してねぇ~(・ω<)。 って感じのメッセージが出ています。


とりあえず、言われるがままに打ち込んでみます。




とりあえず、Goods(商品)というエンティティでも作ります。




(補足:正確にはパッケージ名を入力したほうがよいです。
この場合はentity jpa --class ~.model.Goods --testAutomatically


なんか色々ファイルが作成されます。

どうやらエンティティは作れたっぽいですね。

でも、次に何すればいいのでしょう?

というわけでhintを入力します。




フィールドを追加する場合はfieldと入力して、

TABを押しなさいということだそうです。


というわけで、fieldの後に二回TABを入力すると

ヒントが表示されます。




次にデータの型を入力します。

idを作りたいので、とりあえずnumberにしてみます。

numberと入力してTABを入力。




--fieldNameオプションと--typeオプションが示唆されます。

--fieldNameにはフィールド名(id)を入力し、

--typeにはlongを入力しようと思います。




さて、なんか制約を儲けたいですね。

そんな場合には--を入力してからTABをおします。

(何度も出ていますね。このパターン)




色々と制約が出てきます。

とりあえず、ここでは、

  • --notNull
  • --unique

の二つの制約を与えたいと思います。




なんかソースが更新されたようですね。


同じような感じで、次のフィールドも追加したいと思います。


  • フィールド : name / 型 : String / 制約 : notNull, sizeMax=80
  • フィールド : price / 型 : BigDecimal / 制約 : notNull, decimalMin=0




はい、なんか追加されたっぽいですね。

とりあえず、商品番号とか、商品名とか価格なんてカラムを作ったので、

アプリっぽくなって来ました。


後は画面を作っちゃいましょう。


何をすればいいのかわからないので、

TABを入力します。




とりあえず、画面っぽいコマンドはwebでしょうか…

web TAB TAB と入力します。




とりあえず、mvcと入力しちゃいましょう。




まだ何もやっていないので、setup を入力します。




なんか、めちゃめちゃファイルが出来ました…


さて、次はweb mvc all --package ~.webと入力します。(※1)




なんか画面関係のファイルが出来たっぽいですね。

楽ですね~!



動かす前に


データベースの設定をしていませんでした。

というわけで、設定しちゃいましょう。


データベース


mysqlに作ったスキーマを設定します。

使うコマンドは以下のとおりです。(※1)

  • properties set --name database.properties --key database.password --value [パスワード]
  • properties set --name database.properties --key database.username --value [ユーザー名]
  • properties set --name database.properties --key database.url --value [データベースのURL]




いざ、動かさん!



Rooコンソールを終了して、mavenでjettyを起動します。

roo > quit
$ mvn jetty:run



初回起動時はたくさんのライブラリーを落としてきますので、

結構時間がかかります。




はい。

なんか画面出てきましたね。


ちょっといろいろと触ってみましょう。

左のメニューから「Create new Goods」を選びます。




適当な数字を入れて「SAVE」ボタンを押すと、

ちゃんとValidationやってくれていますね。


では、適当にデータを登録・操作してみましょう。






なんか、簡単にできましたね。


一応、結論


実はここまでIDEが登場していません。

IDEなしでもここまでできるのです。

凄いですねぇSpring Roo。

プログラミングレスって言葉が大好きなSIerさんには受けがいいと思います。

というわけで、Springアプリケーションを作る時に、

Spring Rooを使ってみては如何でしょうか?


さて、明日は


明日は個人でもSpring Advent CalendarをやっているTugu Katagiriさんです。

よろしくお願いします。





(※1) 参考文献


2012年6月7日木曜日

Spring Roo始めました。 その3

今日は、JSR303 (Bean Validation)の話


制約を設ける


セレブが入会する会員制クラブをつくろう!としています。

そこで、メンバーテーブルを作ります。



基本的な制約をここでかけています。

  • 名前
    • not null / 最低2文字 / 最大40文字
  • 姓名
    • not null / 最低3文字 / 最大40文字
  • 年齢
    • 最低20 / not null
  • 収入
    • not null
  • 会員登録日
    • 過去

出来上がったMembershipクラスは次のようなコードになっています。



この段階で自動生成されたテストを流します。



自動生成されたテストのデータというのは、Spring Rooが出力したテストデータ生成用のクラスMembershipDataOnDemandクラスによって作成されます。


ビジネス的な制約の導入


ところでセレブがくる会員制クラブですので、若いヤンキーニーチャンを入会させたくありません。

そこで、30歳未満の人には高めの収入(100,000ドル以上)を持っていることを制約条件に加えようと思います。

まず、テストに上の条件のユーザーの制約を書いてみます。



テストを流します。



30歳未満で収入の低い人が入会できないことを確認するテストyoungMemberCannotBeAppliedが落ちていることがわかります。

では、この条件を実装していきます。

ここで使うのがJSR303のBean Validation APIの@AssertTrueです。

@AssertTrueは指定したフィールドまたはメソッドがtrueを返すことを強制する制約です。

これを用いて条件を実装します。



では確認のためにテストを流しましょう。



追加したテストの方は通ったようですが、あれれ、自動生成されたテストは軒並み落ちていますね。

まあ、勝手に追加した条件なのでSpring Rooの方では検知できないのでしょう。よく考えればそうですね。


git


んで、よく見てみると、モデルに変更を加えた後になぜかAspectJのコードが変化しているようです。



何が変わったのでしょうか?





40文字以上だったら40文字に直してくれてたコードが、直してくれなくなっていますね。

また、年齢が20未満だったら20に直してくれていたコードが直してくれなくなっていますね。

日付についても現在より10,000,000Lだけ前に修正してくれていたコードが現在時間+αになるように変更されています。

Spring Roo君はなんてことをしてくれるんだ!


Push in


こうなったら、AspectJのコードをJavaの方にPush Inして調整する必要があるようです。

変更されてしまったメソッドにカーソルを当てた状態で、IntelliJ IDEAのRefactorメニューからPush ITDs Inを選択します。

(eclipse…知らん…)

その後、MembershipDataOnDemand.javaのPush Inされたメソッドをテストが通る(と言うよりはビジネス的に問題のないデータが提供される)ように修正します。



では再度テストを実行してみます。



はい、通りました。

結論


はい、Spring RooのBean Validation API関連の作業について見てきました。

多少面倒なところはあるもののテストデータを自動で生成してくれたり、テストを自動で生成してくれているところは助かります。

ただ、複数のフィールドにまたがるビジネス上の制約についてはRooはアホなくらい鈍感ですね。

このあたりは慣れるしかなさそうです。

2012年6月5日火曜日

Spring Roo初めてみました。 その2

プロジェクトの作り方。


以下のコマンドを打つべし。

01 project --topLevelPackage your.app.pkg --projectName pjname

データベースの設定


以下のコマンドを打つべし。

01 jpa setup --database MYSQL --provider HIBERNATE

データベースで設定できるのは次のデータベースたち

  • DATABASE_DOT_COM
  • DB2_400
  • DB2_EXPRESS_C
  • DERBY_CLIENT
  • DERBY_EMBEDDED
  • FIREBIRD
  • GOOGLE_APP_ENGINE
  • H2_IN_MEMORY
  • HYPERSONIC_IN_MEMORY
  • HYPERSONIC_PERSISTENT
  • MSSQL
  • MYSQL
  • ORACLE
  • POSTGRES
  • SYBASE

JPAのプロバイダーで設定できるのは次のプロバイダーたち

  • DATANUCLEUS
  • ECLIPSELINK
  • HIBERNATE
  • OPENJPA

その他の設定可能なオプションたち

  • applicationId
    • Google App Engine用のオプション。GAEのapplication idを設定します。
  • hostName, databaseName, userName, password
    • データベースの場所や名前、スキーマ名やパスワードを設定します。
  • jndiDataSource
    • JDBCでなく、JavaEEサーバーが提供するJNDIを用いる場合にJNDI名を指定します。
  • persistenceUnit, transactionManager
    • transactionManagerはSpringのどのtransactionManagerを使うかを設定します。persistenceUnitはJPAの環境を指定します…よくわかっていないorz


なお、Spring Rooでのjpa setupコマンドは何度でも打ち直すことが可能で、そのたびにデータベースの設定を変えられます。

開発環境では開発環境用の設定をして、実際に動かす環境ではまた別の設定をするということが可能です。

なお、Google App Engineで利用する場合は、providerDATANUCLEUSだけだそうです。

Spring Roo初めてみました。

久々にブログ書いています。


みけです。


Spring Rooとは


CUIベースでアプリを作っていけるツールです。

JavaのRADツールですね。

RubyにはRoR、GroovyにはGrailsがあるように、JavaでもRADしたいという思いから生まれたようです。


なんで?


日本ではあまりやる人いないようなので、

まあ、ニッチなところを目指して初めてみました。

書籍『Spring Roo in Action』 も手に入ったことですし。


どんな感じ?


とりあえず、次のようなモデルを作ってみました。

  • タスクを管理するモデル
  • タイトル : 文字列
  • 詳細 : 文字列
  • 終わった? : boolean

Rooだと以下のようなコマンドを入力します。



これにより、作成されるファイルが、javaファイル1つと、aspectJのファイルが5つです。













Spring Rooでは、Javaでコードを書くときに冗長になりがちな部分を単純にして、Javaのコードをすっきりさせるそうですが、

うむ、AspectJのコードだらけでんな。


僕はこのあたりはGrailsの方が好きだったりします。

Grailsのモデルなら、こんな感じでしょうか…



仕組み


AspectJもGroovyもコンパイル時にやっていることはだいたい同じで、

AspectJがコンパイル時にJavaコードにウィービングするのと同様に、

Groovyではコンパイル時にAST変換します。

RooでのコンパイルではAspectJによって、getter/setterやtoStringがJavaに入れられてからコンパイルされるのと同様に、

Groovyではgetter/setterやtoStringを一度生成してから、コンパイルされます。


まあ、まだ両方とも全然さわれていないので、また何かわかったら書こうかな…

おわり。