2009/08/21

ブログ移行のお知らせ

ブログ移行のお知らせです。

多くの人がはてなダイアリーを利用されているようなので少し使ってみました。

使い勝手は非常によく、ブログを書くための時間も半分ぐらいに短縮されました。(コードハイライト機能やh1〜h3の出力のしやすさなどが非常によい)

移行先は

ゲンゾウ用ポストイット-new<http://d.hatena.ne.jp/genzouw/>

です。

よろしくお願いします。

2009/07/23

Grails App Engine Plugin + Gorm JPA Pluginでリレーションを定義してみる

Grails App Engine Plugin + Gorm JPA Pluginで、ひとまずリレーションのないドメインクラスを用意した場合の動作は確認できました。
 次はリレーションを追加してみることにしました。が、うまくいかない。
とりあえず試してみたことを列挙してみる。

環境

  • grails-1.1.1
  • groovy-1.6.3
  • java-1.6.0.14
  • app-engine-plugin-0.8.3
  • gorm-jpa-0.3

まずは単純に動くところまで

ゲンゾウ用ポストイット: Grails AppEngine PluginでJPAを使用する(成功)
にて、リレーションのないドメインが動くところまで。

リレーションを追加

ここからがおかしいのだろうと思う。まずは以下の2つのドメインを作成した。

  • com.sample.Book
  • com.sample.Category

コードは以下のとおり。

Book.groovy
package com.sample

import javax.persistence.*;

@Entity
class Book implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id
    
    String name
    
    String isbn

    @ManyToOne
    Category category

    
    static constraints = {
     id visible:false
 }
}
Category.groovy
package com.sample


import javax.persistence.*;

@Entity
class Category implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id

    String name 
    
    @OneToMany
    List<book> books;
    static constraints = {
    id visible:false
    }
}

あとはcontroller、viewを作成して実行。

  1. grails generate-all com.sample.Book
  2. grails generate-all com.sample.Book
  3. grails clean;grails app-engine

一応画面は起動してくる。

まずはCategoryControllerを起動してみる。

ありゃりゃ。なんだかわからないが、一度戻って再度起動してみる。すると。


よく分からないが起動できるようになった。新規登録してみる。

登録はできるのだが、肝心のBook情報がひもづけられない。
こちらは諦めてトップ画面からBookControllerを呼び出してみる。


すでに一度グライのエラーじゃ動じない。一度戻って再実行する。

新規登録してみる

画面からは先ほど登録したcategoryが選択可能になっている。これはいけるのでは?と思いつつ登録実行するとシステムエラー。でも一覧画面に戻ってみると…

うーん。もう何だか分からん。

もうちょっとapp engine plugin + gorm-jpaのドキュメントが増えてくれれば何とかなるかもだけど。もう少しJPAをじっくり勉強するべきか。GORM使えないとgrailsの魅力が半減している気がしてしょうがない。

GORMを捨てて奥さんが関西Groovy勉強会で説明してくれたJDOの方を選択しようかな。

2009/07/22

Grails In GAEのローカル動作がおかしくなったら

grailsgrails app engine pluginを入れていろいろ試しているのだが、前日に動作していたアプリをドメインクラス1つ追加したぐらいの変更で動作しなくなってしまった。

一度プロジェクトを削除して、再度grails create-appを実行するも、事態は改善に向かわず。

grails app-engineコマンド実行時に以下のようなエラーが出ていた。

Caused by: : The following error occurred while executing this line:
/usr/share/appengine-java-sdk-1.2.2/config/user/ant-macros.xml:94: Java returned: 1
 at org.apache.tools.ant.ProjectHelper.addLocationToBuildException(ProjectHelper.java:541)
 at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:394)
 at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
 at org.apache.tools.ant.Task.perform(Task.java:348)
 at _Events$_run_closure1.doCall(_Events.groovy:54)
 at _GrailsEvents_groovy$_run_closure5.doCall(_GrailsEvents_groovy:59)
 at _GrailsEvents_groovy$_run_closure5.call(_GrailsEvents_groovy)
 at _GrailsWar_groovy$_run_closure4.doCall(_GrailsWar_groovy:240)
 at AppEngine$_run_closure2.doCall(AppEngine:26)
 at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:324)
 ... 10 more
Caused by: /usr/share/appengine-java-sdk-1.2.2/config/user/ant-macros.xml:94: Java returned: 1
 at org.apache.tools.ant.taskdefs.Java.execute(Java.java:107)
 at com.google.appengine.tools.enhancer.EnhancerTask.execute(EnhancerTask.java:99)
 at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
 at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
 at org.apache.tools.ant.Task.perform(Task.java:348)
 at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:62)
 at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
 at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
 at org.apache.tools.ant.Task.perform(Task.java:348)
 at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:391)
 ... 18 more

grails clean;grails app-engineとコマンド実行して、一度クリーンしてもダメ。

結局以下の方法で動作するように解決できた。

  1. $HOME/.grails/1.1.1/project/<PROJECT_NAME>フォルダを削除
  2. grails create-appで作成したプロジェクトを削除
  3. grails create-appでプロジェクトを再作成

なんかおかしな情報が残ってしまっていたみたいです。

2009/07/16

Grails in GAEの課題

ようやくGoogle App EngineGrails + GORMが動いた。

けれどもいくつか気になる点が。

前提

あくまで以下のプラグインを使った僕の環境での課題です。

  • grails appengine plugin
  • grails gorm-jpa plugi

アプリのURLはこちら。

Book List

Grailsでのメッセージ表示

Grailsで生成されるControllerクラスを見てみると、以下の処理終了後にメッセージを出力するようになっている。

  • 登録(save)
  • 更新(update)
  • 削除(delete)

Grailsにはいくつかのスコープが存在していて一般的なリクエスト、セッションの他にフラッシュなんてのもある。

Japanese Controllers - Grails - Codehaus

上記の更新処理実行後は、

flash.message = "~なんかメッセージ~"

と言う風に表示したいメッセージをセットしている。

Viewではこのflash.messageが空でない場合のみ表示するようになっている。

GAE上だとメッセージがずっと残ってしまう(Grails AppEngine Pluginの問題?)

通常は画面表示後にflashスコープの内容がクリアされる。

GrailsプロジェクトにGrails AppEngine Plugin、Gorm-JPA Pluginを入れてもこれは同様。

ただし、GAE上にアップするとなぜかflashスコープの値がクリアされなくなってしまう。更新後に表示されたメッセージが、たとえば一覧画面を飛び回っている間も表示され続けたりする。挙句の果て、次の更新、削除を行ってもメッセージが切り替わらない。

[HOME]のリンクおかしい

 こちらはローカルでも出るので、Grails AppEngine Pluginが原因の可能性が大きい。

画面の左上の[HOME]のリンクを押しても、現在表示中のページがリロードされるだけ。サイトのトップへ移動してくれなくなってしまった。

暇があったら原因を調べてみたい。