祝1.4系。Grails 1.4-M1リリース。
お久しぶりです。2011/2/16の1.3.7リリースが懐かしく感じます。
Grails 1.4系最初のマイルストーンリリースです。
今回は結構深いところまで大幅改善されています。ソースコードの階層が整頓されてたり、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/
では、新機能と向上等の内容をリリースノートの意訳どうぞ!
Upgraded Libraries ライブラリの更新
Grails 1.4には、Spring 3.1 M1, Groovy 1.8, Hibernate 3.6, Servlet 3.0 and Tomcat 7.0がバンドルされています。
リロードエイジェント
クラスのリロードを行う、新しいJVMエージェントの実装により、今までサポートされていなかったクラス、静的型のサービス、ドメインクラス等のリロードが可能になります。
プラグイン使用数等のトラッキング機能
プラグイン使用レポートを収集する機能が実装されました。近いうちにプラグイン使用統計がGrailsのサイトで公開されます。
スカッフォルドUIの向上
スカッフォルドUIは、HTML5で強化されました。
一新された、テストレポートとドキュメントテンプレート
新たなテンプレートにより、テストレポートとドキュメントが向上しました。
resourcesプラグインがGrailsコアに統合
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での抽象クラス継承のサポート
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がJavaから使用可能に。
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ネームスペースのタグのタグ属性サポート
linkネームスペースを持つタグが、attrs属性で、HTMLタグの属性を定義できます。
以下のようなタグがあって、
<link:accountDetails attrs="[class: 'fancy']" acctNumber="8675309">Show Account</link:accountDetails>
下のURLマッピングで定義されてたとします:
… "/details/$acctNumber"(controller: 'account', action: 'showAccount') ...
処理された結果は:
<a href="/details/8675309" class="fancy">Show Account</a>
H2データベースエンジン
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コマンドを使いましょう。