3

Grails 2.0.1 の Grails コントローラでコマンド オブジェクトを使用しています。これは素晴らしい機能であり、完全に検証されたパラメーターを備えた非常に優れた簡潔なコントローラーにつながっています。いくつかの固定パラメーターといくつかの可変長パラメーターがあるコントローラーに実装された Web サービス呼び出しがある場合があります。私はいたるところでグーグルで検索しましたが、例が見つからないようです。grails のドキュメントは、一般的にコマンド オブジェクトに関してかなり簡潔です。Command オブジェクトがなくてもやりたいことはできますが、そうすると、他のすべての呼び出しで Command オブジェクトを使用するこの一連のコントローラーのパターンが崩れてしまいます。FWIW この特定の呼び出しは、データをバックエンドに送信する POST です。ここには Domain オブジェクトはありません。データはスプレッドシートの行に変換されています。

コードサンプルが役立つかどうかはわかりませんが、とにかくここにあります:

package com.companyname.platform.api

    class ApiController {
        static allowedMethods = [save:'POST', close:'POST', storeResults: 'POST']

        def save = { APISaveCommand cmd->
            doSaveAction(cmd)
        }
        def close = APICloseCommand cmd->
            doCloseAction(cmd)
        }
        def storeResults = { params->
            doStoreResults(params)
        }
    }
}

storeResults に Command オブジェクトがないことがわかりますか? 可変数のパラメーターを取ります。上記のコードでは、do*Action メソッドが、このコントローラーに挿入された Service にあると想定しています。doStoreResults(params) に問題はありませんが、コマンド オブジェクト パターンに固執したいと思います。

4

1 に答える 1

1

あなたのコメントによると、はい、この場合コマンドを使用することは可能です。jut は、コマンド内のすべてのフィールドを宣言し、ペアで宣言する必要があるフィールドにカスタム バリデータを実装します。

バリデーターでは、フィールド値とオブジェクト インスタンスにアクセスできるため、一方が null で、もう一方が null でないかどうかを簡単に比較できます。

@Validateable
class MyCommand {
  String a
  String b
  String c

  static constraints = {
    a nullable: false, blank: false
    b validator: { val, obj ->
      if((!val && obj.c) || (val && !obj.c)) {
        return 'mycommand.declareBAndC.message' //key to the i18n message
      }
    }
  }

}
于 2012-12-11T16:31:50.753 に答える