Grails 2.4.0 リリースきた!!!!
Grails 2.4.0 リリースです!!
例のコペンハーゲンで開催されるカンファレンスが、いよいよ、来週と迫ってまいりました!
行きたい!行きたい!行きたい!
そんな中の、Grails 2.4 リリース。もぅ、何だったら、今やってるプロジェクトを全部 2.4 にしてやりますっ!!
Grails 2.4 での更新内容!
Groovy 2.3に更新!!!
- Groovy 2.3のリリースノートはこちら http://groovy.codehaus.org/Groovy+2.3+release+notes
Spring 4 に更新
- Spring 4のドキュメントはコチラ http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/new-in-4.0.html
- もちろん Java 8 対応!
デフォルトのHibernateが4.3.5に変更。
- Hibernate3はプラグインで引き続き提供。
スタンドアロンGORM
- https://spring.io/guides/gs/accessing-data-gorm/
- https://spring.io/guides/gs/accessing-data-gorm-mongodb/
静的アセット管理はリソースプラグインから、アセットパイプラインに変更!
- アセットパイプラインプラグイン
- アセットパイプラインがデフォルトになった事で、プロジェクトにgrails-app/assetsフォルダが追加されます。その下の階層には、javascripts,stylesheets,imagesフォルダが提供されます。
- javascriptのマニフェストは直接javascriptファイルに以下のように記述します。
//= require jquery //= require_self //= require file_a //= require_tree . console.log('some javascript');
- アセットをGSPで設定するには、以下のタグが提供されます。
<asset:javascript src="application.js"/> <asset:stylesheet href="application.css"/> <asset:image src="grails_logo.png" height="60" />
スタンドアロンGSP
- Spring bootでGSPが使えるようになりました。サンプルは以下に。
- https://github.com/grails/grails-boot/tree/master/sample-apps/gsp/gsp-example
スタティックコンパイル対応!
- ドキュメントはコチラ
- grails.compiler.GrailsCompileStaticアノテーションAPIリファレンス コチラを参照
- grails.compiler.GrailsTypeCheckedアノテーションAPIリファレンス コチラを参照
サンプルコードはこんな感じです。
import grails.compiler.GrailsCompileStatic import groovy.transform.TypeCheckingMode @GrailsCompileStatic class SomeClass { def update() { // this method will be statically compiled } @GrailsCompileStatic(TypeCheckingMode.SKIP) def save() { // this method will not be statically compiled } def delete() { // this method will be statically compiled } }
Ajaxタグが無くなります
- formRemote, remoteField, remoteFunction, remoteLinkなどのAJAXタグが将来のバージョンで無くなります。
grails-debugとgrails-debug.batが削除されました
コマンドオブジェクト関連
- コマンドオブジェクトでの nullable:false 対応
- コマンドオブジェクトデータバインダーで同じドメインで複数引数が可能に。
以下のように、Personが複数指定されている場合に、リクエストパラメータを、buyer.nameやseller.name等の指定をすると、それぞれのオブジェクトにバインドされます。
class StoreController { def buy(Person buyer, Person seller) { // … } } class Person { String name }
GORMで、よりアドバンスドなサブクエリー
サブクエリーが拡張されました。ネストサブクエリで"in"が使用できます。
def results = Person.where { firstName in where { age < 18 }.firstName }.list()
Criteriaとwhereクエリがシームレスに融合できます
def results = Person.withCriteria { notIn "firstName", Person.where { age < 18 }.firstName }
サブクエリでプロジェクションを一緒に使用できます。
def results = Person.where { age > where { age > 18 }.avg('age') }
2つのドメインクラスに別れた関連するクエリ実行:
def employees = Employee.where { region.continent in ['APAC', "EMEA"] }.id() def results = Sale.where { employee in employees && total > 100000 }.employee.list()
whereクエリでの簡単な変数宣言を使用したエイリアス(クロスクエリリファレンス)のサポート。
def query = Employee.where { def em1 = Employee exists Sale.where { def s1 = Sale def em2 = employee return em2.id == em1.id }.id() } def results = query.list()
ネームスペース付きのコントローラでのビューの選択
- 新たにネームスペース付きコントローラ用のビューディレクトリが選択されるようになりました。
namespace指定があるコントローラのビューファイルは、grails-app/views/
class SomeController { static namespace = 'foo' def myaction(){ //この場合は、 grails-app/views/foo/some/myaction.gspが最初に参照され //存在しない場合は grails-app/views/some/myaction.gsp が参照されます。 [number:1] } }
- withTransaction実行の際にトランザクション属性が設定できます。
// org.springframework.transaction.support.DefaultTransactionDefinition のプロパティに対応したMapキーで指定 Account.withTransaction([propagationBehavior: TransactionDefinition.PROPAGATION_REQUIRES_NEW, isolationLevel: TransactionDefinition.ISOLATION_REPEATABLE_READ]) { // ... }
Mavenプラグイン更新
Mavenプラグイン(2.4.0)は、Aetherベースで再構築されました。Aetherベースになった事で、今後のGrails 2.3.x , 2.4.xが更新されても、Mavenプラグインを更新する必要がなくなります。これにより、Mavenプラグインは、このバージョンが最後に!?
Unitテスト向上。
(意訳が変なので注意!しかも途中あきらめて(ry)
以前のTestMixinベースの方法で、Grails"unit testing runtime"があります。今回からTestMixinクラス関連とGrails"unit testing runtime"のライフサイクルをハンドルする実際のランタイムが切り分けられました。これによってランタイムのステートは、TestMixin関連クラスのスタティックフィールドに保持されません。TestMixinアノテーションの背後にあるGroovy AST変換は、JunitとSpockテストクラスへJUnitルールフィールドをクラスに追加します。
主な機能としては(間違ってたらゴメン):
- GrailsアプリケーションのUnitテストのプログラミングモデルは変わりません
- Setup/teardownメソッドの順番は決定的となります。理由としては新たな統合方法が単一のJUnit Ruleフィールドを使用しているのとテストランタイムが内部的イベントでリソースのsetupとteardownを行うため。
- UnitテストにdoWithSpringとdoWithConfigのコールバックが存在します。これらのコールバックメソッドは、UnitテストランタイムがgrailsApplicationインスタンスを初期化する前に呼び出されます
- GrailsUnitテストランタイムアプリケーションのアプリケーションコンテキストにBeanとしてSpockモックをレジスト可能。モックでコラボレータビーンの入替ができます。
- いくつかのテストクラスに1つのアプリケーションコンテキストを再利用できます。
- Grails Unitテストランタイムはイベントベースプラグインアーキテクチャを持っています。新たにテストランタイムプラグインクラスを提供することで、テストランタイム機能を追加することが可能です。テストランタイムプラグインAPIは、今後変更される予定です。変更内容はGrailsコミュニティのフィードバックをベースとします。メインとなるAPIインターフェイスのドキュメントはJava Docに有ります: TestPlugin, TestEventInterceptor, TestEvent。現在は使用可能なプラグインをスキャンする方法が無いため、カスタムテストプラグインは制限されています。現状ではテストクラスの初期化ブロックでTestRuntimeFactory.addPluginClassをコールすることでカスタムテストプラグインを追加できます。
詳しくは、更新されたUnitテストのドキュメントを参考にしましょう
allowedMethodsのUnitテスト対応向上
以下のようなコントローラがあるとして
package com.demo class DemoController { static allowedMethods = [save: 'POST', update: 'PUT', delete: 'DELETE'] def save() { render 'Save was successful!' } // … }
以下のように記述します
package com.demo import grails.test.mixin.TestFor import spock.lang.Specification import static javax.servlet.http.HttpServletResponse.* @TestFor(DemoController) class DemoControllerSpec extends Specification { void "test a valid request method"() { when: request.method = 'POST' controller.save() then: response.status == SC_OK response.text == 'Save was successful!' } void "test an invalid request method"() { when: request.method == 'DELETE' controller.save() then: response.status == SC_METHOD_NOT_ALLOWED } }
GORM for Hibernate in Unit tests
HibernateTestMixinを使用する事で、今後Hibernateを使用したGORMのUnitテストはインテグレーションテストを書く必要が無くなります。
import grails.test.mixin.hibernate.* @TestMixin(HibernateTestMixin) class PersonSpec extends Specification{ void setupSpec() { hibernateDomain([Person]) } void "Test count people"() { expect:"Test execute Hibernate count query" Person.count() == 0 sessionFactory != null transactionManager != null session != null } }
Grails 2.3からの更新注意点。
(公式ドキュメント) http://grails.org/doc/2.4.x/guide/upgradingFrom23.html
一部を抜粋
grails set-grails-version 2.4.0
- スタティックHolderクラス - 以下のHolderクラスがGrails 2.4から無くなります。代わりにgrails.util.Holdersを使用しましょう。
- applicationContex.xmlの内容変更
- web.xmlの内容変更
ここまでとしておきます。
長かった。。
更新内容に関しては、ほぼ、ここの記事に書いています。間違いなどあったら、やさしく教えてください!
日本語ドキュメントは、頑張って更新します。それまでは、本家ドキュメントを!
http://grails.org/doc/2.4.x/
Grails 2.4.0 の公式リリースノートはこちら。
http://grails.org/2.4.0+Release+Notes
JIRA http://jira.grails.org/secure/ReleaseNote.jspa?projectId=10020&version=13803
ダウンロード http://grails.org/Download
直リン grails-2.4.0.zip
ドキュメント http://grails.org/doc/2.4.x
さて、いよいよ年末リリースの3.0に向けての開発が始まるみたいです!
Grails 3.0では、Spring Bootがベースになり、Gradleサポートとなり、さらには、数年前から目標となっていた、アプリケーションを、マイクロサービスから今までのようなWebアプリケーション形式までの幅広い形式に対応予定との事!
次も楽しみ!先ずは Grails 2.4 を楽しみましょう!