2016-09-20 8 views
0

たとえば、ユーザーを保存するRESTエンドポイントの設定を指定すると、コマンドオブジェクトのvalidate()を使用して特定のHTTPエラーコードを取得できます応答を処理するコントローラ?Grailsコマンドオブジェクトの検証から特定のHTTPエラーコードを返す

コントローラーアクションが多くのifブロックを処理し、特定のエラーメッセージをチェックし、HTTPエラーコードにルックアップ/変換する必要がある状況を回避したいと考えています。

たとえば、データベース内の一致するユーザーを見つけることができなかった場合、カスタムバリデーターに何らかの方法で404を返すように指示します。

以下は私が試したことではありません。代わりに、RESTパラメータの検証に使用したい理想的な構造の概念の証明に過ぎません。おそらく、これは完全に間違っているか、より良いアプローチがあるでしょう。もしあれば、それも歓迎されるでしょう。

例:

User.groovy

... 
class User { 
    String username 

    static constraints = { 
     username unique:true 
    } 
} 

UserController.groovy

... 
class UserController extends RestfulController { 
    def update(UserCommand userCmd) { 
     /* 
     * Not actually working code, but proof of concept of what 
     * I'm trying to achieve 
     */ 
     render status: userCmd.validate() 
    } 

    class UserCommand { 
     Long id 
     String username 

     static constraints = { 
      importFrom User 

      /* 
      * I also get that you can't return Error codes via the 
      * custom validator, but also just to illustrate what I'm 
      * trying to achieve 
      */ 
      id validator: { 
       User user = User.get(id) 
       if(user == null) { 
        return 404 
       } 
      } 
     } 
    } 
} 

答えて

1

を行うことができます。ユーザーを保存しているのに見つからない場合は、それはいいですか?また、ユーザーを更新している場合は、おそらくコントローラでupdate()アクションを呼び出してください。あなたのコマンドオブジェクトに対処することを調整することができます

class UserController { 

    def edit() { 
     withUser { user -> 
      [user:user] 
     } 
    } 

    private def withUser(id="id", Closure c) { 
     def user = User.get(params[id]) 
     if(user) { 
      c.call user 
     } else { 
      flash.message = "The user was not found." 
      response.sendError 404 
     } 
    } 
} 

しかし:それは良いアイデアだと思いながら、それは動作しませんから、私はより多くの以下のようなものをお勧めしたい、と述べた

私はそれがより多くなることの一般的な考えを与えると思う。DRY

+1

ありがとう、私は更新を意味した。これは有望です –

+0

あなたの 'withUser'メソッドで 'id =" id "'パラメータを説明するいくつかのドキュメントを説明してくれますか?私はそれが何であるか分からない。 –

+1

これは上書きできる変数です。したがって、別のパラメータでオブジェクトを検索する場合は、デフォルトの "id"ではなくidとして渡します。 – Gregg

0

たぶん、あなたは

で何か他のものを解析して行う実際のエラー、その後404を戻してくださいが、必要があります

あなたはiで遊ぶために膨大な量のエラーコードを持っていません。 n個の第1のインスタンス(that will make proper sense and actually valid)

if (userCmd.validate()) { 
    def error=userCmd.errors.allErrors.collect{g.message(error : it)} 
    render status:404,text: error 
    return 
} 
//otherwise 
render status:201, text: 'something' 

あなたもだからあなたの例では、多くの意味がありません

response.status=404 
render "Some content" 
関連する問題