2011-05-24
祝1.4系。Grails 1.4-M1リリース。
お久しぶりです。2011/2/16の1.3.7リリースが懐かしく感じます。
今回は結構深いところまで大幅改善されています。ソースコードの階層が整頓されてたり、gradleビルドが大幅調整されてたり、GORM関連なんてそれはもう!
注目なのはUnitテストの大改造。コントローラのUnitテストが大変な事に!
ただし!まだM1なので気をつけましょう!
http://grails.org/1.4-M1+Release+Notes
jira http://jira.grails.org/browse/GRAILS/fixforversion/11040
http://jira.grails.org/secure/ReleaseNote.jspa?projectId=10020&version=11040
ダウンロード http://grails.org/Download
直リン http://dist.springframework.org.s3.amazonaws.com/milestone/GRAILS/grails-1.4.0.M1.zip
ドキュメント http://grails.org/doc/1.4.0.M1/
Grails 1.4には、Spring 3.1 M1, Groovy 1.8, Hibernate 3.6, Servlet 3.0 and Tomcat 7.0がバンドルされています。
リロードエイジェント
クラスのリロードを行う、新しいJVMエージェントの実装により、今までサポートされていなかったクラス、静的型のサービス、ドメインクラス等のリロードが可能になります。
プラグイン使用レポートを収集する機能が実装されました。近いうちにプラグイン使用統計がGrailsのサイトで公開されます。
スカッフォルドUIの向上
新たなテンプレートにより、テストレポートとドキュメントが向上しました。
resourcesプラグインが完全に統合されました。簡単に、キャッシュ・gzip・バンドリングなどにより、最適化された静的リソースの取り扱いが可能となります。
ベターユニットテスト
詳しくは完全に書き直された、Unitテストのドキュメントを参照してください。
JUnit3,JUnit4,Spockで使用可能な、ユニットテストMixinがベースになっています。
全てのアーティファクトにおいて、もの凄くUnitテストが単純化されています。例えば。
// テストするクラス class SimpleController { def home() { render view:"homePage", model:[title:"Hello World"] } … } void testIndex() { controller.home() assert view == "/simple/homePage" assert model.title == "Hello World" }
このリリースで以前はインテグレーションテストが必要だった、フィルタ−、URLマッピング、ファイルアップロード、コンテントネゴシエーション、テンプレートビューレンダリング、クライテリアクエリーなどもUnitテストでサポートされます。
GORMが抽象クラス継承階層をサポートしました。これによって、関連リンクやクエリ等を抽象クラスに定義することができます。
abstract Media { String title … } class Book extends Media { } class Album extends Media { } class Account { static hasMany = [purchasedMedia:Media] } .. def allMedia = Media.list()
GORM APIは、Groovy transformationによって、GORMエンティティのバイトコードとして注入されます。これによりGORMのメソッドは、Javaコードから、呼び出したり見たりできます。
Book book = new Book(); book.setTitle("The Stand") book.save(); System.out.println(Book.count()); System.out.println(Book.list());
linkネームスペースを持つタグが、attrs属性で、HTMLタグの属性を定義できます。
以下のようなタグがあって、
<link:accountDetails attrs="[class: 'fancy']" acctNumber="8675309">Show Account</link:accountDetails>
… "/details/$acctNumber"(controller: 'account', action: 'showAccount') ...
処理された結果は:
<a href="/details/8675309" class="fancy">Show Account</a>
Grailsでは新規アプリケーション作成時のデフォルトデータベースが、今までのHSQLDBにかわりH2になります。
管理コンソール付き!
名前付きクエリがドメインクラスのリレーションを含んでいる場合、そのリレーション先の名前付きクエリを使用することが可能になりました。
class Author { static hasMany = [publications:Publication] static namedQueries = { authorsWithRecentPublications { publications { // invoking a named query defined in the Publication class… recentPublications() } } } } class Publication { Author author static namedQueries = { recentPublications { def now = new Date() gt 'datePublished', now - 10 } } }
フィルターでのコントローラ・アクション・URIの除外指定が実装されました。
filter1(actionExclude: 'log*') { before = { // … } } filter2(controllerExclude: 'auth') { before = { // … } } filter3(uriExclude: '/secure*') { before = { // … } }
コマンドオブジェクトが共有制約をサポートしました。実装方法は以前に追加されたドメインクラスと同じです。
OrCreateとOrSaveクエリーの実装追加
ドメインクラスに、findWhereやfindByメソッドに似た、nullを返さない、findOrCreateWhere, findOrSaveWhere, findOrCreateBy, findOrSaveByのクエリーをサポートしました。
実行結果にインスタンスが見つからない場合は、指定された値で、新規にインスタンスを作成して返します。findOrSaveWhereとfindOrSaveByの場合はインスタンスを保存してからインスタンスを返します。
def book = Book.findOrCreateWhere(author: 'Douglas Adams', title: "The Hitchiker's Guide To The Galaxy") def book = Book.findOrSaveWhere(author: 'Daniel Suarez', title: 'Daemon') def book = Book.findOrCreateByAuthorAndTitle('Daniel Suarez', 'Daemon') def book = Book.findOrSaveByAuthorAndTitle('Daniel Suarez', 'Daemon')
依存ライブラリ・プラグインにSNAPSHOTが有る場合の自動更新
依存ライブラリ・プラグインのバージョン番号が"SNAPSHOT"で終わる物は、常に最新を確認するようになりました。
パーマネントリダイレクト(301)のサポート
redirect() メソッドにtrueを指定すると、リダイレクトは、301のHTTPステータスで送信され、その逆であれば、302で送信されます。
1.4での変更点と非推奨になった項目
- OpenRicoBuilderは除外されました。
- grails.web.JSONBuilderが外されたことにより、JsonBuilderは非推奨となりました。
- 全てのスタティックホルダーは非推奨となりました。
- GORMエンティティを拡張した抽象クラスは必ずsrc/groovyに入れましょう
- クライテリアクエリのJOINは、デフォルトでINNER JOINになりました。(元はLEFT JOIN)
- コントローラのパブリックメソッドは、アクションとして扱われます。そうでない物はprivateかprotectedにしましょう。
- 'count'はドメインクラスの正当なプロパティでは無くなりました。
- 'release-plugin'コマンドは無くなります。プラグインをリリースする際は、Releaseプラグインの 'publish-plugin'を使用します。
- resourcesプラグインがインストールされている場合、g:resourceはFileNotFoundExceptionを投げるようになります。
- redirect()の後にヘッダーを追加を可能にするためのresponseは、redirect()ではコミットされなくなります。response.isCommitted()を使用している場合は、request.isRedirected()を使用するように変更する必要があります。
- withFormatメソッドは、CONTENT_TYPEを精査しなくなります。今後はファイル拡張子・フォーマットパラメータ・ACCEPTヘッダーを参照します。request.withFormat(Closure)の追加により、CONTENT_TYPEを処理できます。
- デフォルトのapplicationContext.xmlが変更されたのでアップグレードの際は、grails upgradeコマンドを使いましょう。
- 22 http://www.google.co.jp/search?q=Gaelyk+eclipse&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox-a
- 21 http://www.xmldo.net/Home/ncstaffblog
- 12 http://twitter.com/
- 11 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=Grails+1.4
- 10 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBkQFjAA&url=http://d.hatena.ne.jp/mottsnite/20081107/1226047629&rct=j&q=glassfish jar&ei=g0nfTfCRMIiavAPIv9TKBQ&usg=AFQjCNHwaNY1rpwlKXSNoGADhVe8Bjjdfw
- 9 http://www.jggug.org/
- 8 http://longurl.org
- 8 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBwQFjAA&url=http://d.hatena.ne.jp/mottsnite/20090222/1235290545&rct=j&q=Automatic Transitive Plugin Resolution&ei=ZCzfTaTRGpGGvAOf08DXBQ&usg=AFQjCNHPmwu-rA30YEGvLsZ0LSu-Zh-_JA&sig2=n
- 7 http://d.hatena.ne.jp/uehaj/20100225/1267106256
- 7 http://xmldo.blogspot.com/



