GriffonでControllerにメソッドを作る際の注意

Griffon, Groovy

最近はGriffonでアプリを作る機会が多いですが、ハマったことを載せておきます。

とある、非常に簡単な画面があるとします。

  • ボタン1つ、テキストフィールド2つ。
  • ボタンを押すと、テキストフィールドに値をセットする。
  • セットする値は、それぞれfunc1メソッド、func2メソッドの実行結果。

実行環境

$ uname -vs
Linux #32-Ubuntu SMP Tue Dec 11 18:51:59 UTC 2012
$ griffon -version
------------------------------------------------------------
Griffon 1.0.0
------------------------------------------------------------
Build: 04-Jun-2012 08:53 PM
Groovy: 1.8.6
Ant: 1.8.2
Slf4j: 1.6.4
Spring: 3.1.1.RELEASE
JVM: 1.7.0_09 (Oracle Corporation 23.2-b09)
OS: Linux 3.5.0-21-generic amd64

Controller

※View、Modelのソースコードは省略します。今回ハマった点はControllerの組み方です。

package testpj
import groovy.util.logging.Slf4j
class TestpjController {
    // these will be injected by Griffon
    def model
    def view
    def clicked = { evt = null ->
        log.info "clicked - start."
        try {
            doOutside {
                doLater {
                    model.text1 = func1()
                    model.text2 = func2()
                }
            }
        } catch (e) {
            log.error "clicked - exception.", e
        } finally {
            log.info "clicked - end."
        }
    }
    def func1() {
        return "てすとですよ"
    }
    String func2() {
        return "てすとですよ"
    }
}

ごちゃごちゃ書いていますが、model.text1、model.text2にセットしているあたりが注意です。

ボタン押下前

ボタン押下前

func1の結果が表示されません。

Griffonでは、以下の条件のメソッドについては値が返却されません。

  • Controller内で定義している。
  • 返却するオブジェクトのクラスを明示していない
    Griffonでは、こういうケースはサービスを作成するのが正しそうです。サービス作成用のコマンドは以下になります。
$ griffon create-service hogeService

Griffon, Groovy

Posted by genzouw