ゲンゾウ用ポストイット

Java、Groovy、Linux関連の備忘録

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

久々のブログ更新です。

最近は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
広告を非表示にする