2011-09-15 10 views
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; 
      } 
     } 
    } 

 

グレーズ1.3.7互換の解決策では、まったく可能ですか?

答えて

1

いいえ、あなたが求めていることはできません。コマンドオブジェクトは、コントローラ、サービスなどのフルフレームワーク成果物ではないため、コントローラアクションのパラメータでない限り、検証ロジックが追加されません。そのために、フィルタ内のコマンドオブジェクトにはチェックする方法が.validate()またはではありません。定期的なGroovyのクラスとしてsrc/groovyにあなたのコマンドオブジェクトを移動し、@Validateableでそれに注釈を付ける

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

は別のオプションとして、あなたは @Validateable注釈を使用することができます。次に、あなたのフィルタでは、あなたが行うことができます。

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

あなたはConfig.groovyにgrails.validateable.packagesリストにあなたのvalidateableクラスのパッケージ名を追加していることを確認します。

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 
     } 
    } 
} 
+0

また、プラグインを作る気にしないならば、あなたはこの方法でこれをカプセル化することができそれは自動的にすべてのコントローラに追加されるので、サービスを持たずに 'onValid(cmd){...}'になります。 – OverZealous

+0

もう1つのオプション - プラグインの代わりに、コントローラの基本クラスを作成し、それを継承します。上のように単純なメソッド呼び出しにすることもできます。 – OverZealous

関連する問題