2

私はよく次のようなものを書きます:



    def myAction{ MyActionCommand cmd ->
       if( cmd.hasErrors() ){
          return render(status:HttpServletResponse.SC_BAD_REQUEST );
       }else{
          // actual action logic
       }


そこで、その一般的なパターンを再利用可能な場所に抽出したいと思います。フィルタは適切な候補のように見えますが、フィルタからコマンドオブジェクトを取得する方法が見つかりません。このようなことを試しました(フィルタークロージャーで):



    formValidation( controller:'*', action:'*' ){
       before = { cmd ->
          if( cmd.hasErrors() ){
              response.sendError( HttpServletResponse.SC_BAD_REQUEST );
              return false;
          }else{
              return true;
          }
       }
    }


grails1.3.7互換ソリューションに関心があります。それは可能ですか?

4

2 に答える 2

1

いいえ、あなたが求めていることをすることはできません。コマンドオブジェクトは、コントローラーやサービスなどの完全なフレームワークアーティファクトではないため、コントローラーアクションのパラメーターでない限り、検証ロジックは追加されません。そのために、フィルター内のコマンドオブジェクトには、チェックする.validate()orメソッドがありません。.hasErrors()

@Validateable別のオプションとして、注釈を使用できます。

http://grails.org/doc/latest/guide/7.%20Validation.html#7.5%20Validation%20Non%20Domain%20and%20Command%20Object%20Classes

コマンドオブジェクトをsrc/groovy通常のGroovyクラスとして移動し、。で注釈を付け@Validateableます。次に、フィルターで次のことができます。

def validObj = new MyValidateable(params)
if (!validObj.validate()) {
    response.sendError( HttpServletResponse.SC_BAD_REQUEST );
    return false;
} else {
    return true;
}

検証可能なクラスのパッケージ名をgrails.validateable.packagesConfig.groovyのリストに追加してください。

于 2011-09-15T15:03:56.127 に答える
0

このようなサービスを作成するのはどうですか?

class AutoValidateService {
    def onValid(def cmd, Closure onValid) {
        if( cmd.hasErrors() ){
            return render(status:HttpServletResponse.SC_BAD_REQUEST );
        }else{
            onValid()
        }
    }
}

そのようにそれを使用してください:

class FooController {

    AutoValidateService autoValidateService

    def myAction{ MyActionCommand cmd ->
        autoValidateService.onValid(cmd) {
            // do something
        }
    }
}
于 2011-09-15T19:44:22.443 に答える