2012-02-18 8 views
6

私は私のコントローラのいずれかで、次のように定義されたアクションメソッドを持っている:ポストが正常に永続化されるときこのSpring MVCコントローラからエラーステータスと検証エラーを返すにはどうすればいいですか?

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody Post create(@Valid Post post, BindingResult bindingResult) { 
    if (bindingResult.hasErrors()) { 
     // how to return an error status + error messages from here? 
    } else { 
     postRepository.persist(post); 
     return post; 
    } 
} 

は、私は戻って、クライアントへの投稿を返します。しかし、検証エラーが発生した場合は、エラーステータスコードとすべての検証エラーメッセージをクライアントに返します。

これを行うにはどうすればよいですか?

+0

APIまたはハンドリングフォームを設計していますか? –

+0

私はREST APIを設計しています。 –

答えて

7

サインは、あなたがあなた自身のPOJO horacemanで述べたように、奇数動作や検証エラーを表します(別名。リソース)を作成する必要があります。私たちのアプリケーションでどのように行うのかをお見せしましょう。

データ表現としてJSONを使用しているので、予期しない例外が発生した場合は、次の情報を受け取ります。

{ "status" : "EXCEPTION", "exceptionName" : "MyCustomException", "exceptionMsg" : "ex.unsupportedOperation" } 

これはもちろん例です。これについての良い解決策は、適切なi18nメッセージを表示するか、そのままの状態でユーザーに表示するためにフロントエンドのキーとしてexceptionMsgを扱うことができるということです(この場合、わかりやすいメッセージを使用します)。すべてがOKであるとき

は今、私たちはこのような何かを:

{ "status" : "OK", "data" : {(...)} } 

Data要素はオプションです。フロントエンドに通知するために必要なものをすべて送信することも、完全にスキップすることもできます。

最後のシナリオはあなたの検証エラーです。このケースでは、通常、次の内容を送信します。

{ "status" : "VALIDATION_FAILED", "errors" : [ "fieldName" : "username", "errorCode" : "validation.requiredField", "errorMsg" : "Username is required."] } 

だから、はっきりAPIクライアントは、検証が失敗し、適切な分野でいることを情報受信します - 何が悪かったのかについての正確な詳細を。もちろんerrorsは配列(またはList)ですので、必要なだけ多くの詳細を提供します。

どうすればいいですか? 簡単に、これらのオブジェクトは、ジャクソンを使用してJSONに変換される単純なPOJOSです。これはJSON表現の可能性を無制限に与えます。私がやっているのは、検証エラーを表すPOJOを準備していて、それをModelとしてModelAndViewインスタンスに追加しています。 JSONマーシャリングを適切に行うためにSpringに依存しています。あなたのケースでは

は、あなたのPostインスタンスと@ResponseBody注釈を持っているので、私の知る限りでは、あなたはそれを行うことはできません。あなたの設定は、「まあ、何が起こっても、常にポストのインスタンスを返します」と言っています。あなたがするべきことは、それを単純な0​​と置き換えることです。それには、検証に基づいて適切なModelを与え、それをクライアントAPIに返します。

+0

ありがとう! 1Kに達しました:D –

3

私はあなたのコントローラでajaxコールをしたいと思う。メソッド内でpostオブジェクトを返すので、別のオブジェクト(コード付きのエラーメッセージなど)を返すことはできません。 ExecutionResultを返すのはどうでしょうか?あなたはREST APIをdesiginingている

ExecutionResult{ 
private int statusCode; 
private String message; 
private Object yourPost; 
//get and set methods here... 
} 
3

@ResponseBodyでは、BindigResultをメソッドシグネチャから削除し、BindExceptionをスローさせます。次に、@ExceptionHandlerメソッドを使用して、説明されているLikaczとしてエラーを含むオブジェクトを返します。

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody Post create(@Valid Post post) { 
    postRepository.persist(post); 
    return post; 
} 

@ExceptionHandler 
public ValidationErrors handleException(BindException ex) { 
    // ... 
} 
+0

応答ボディに 'ValidationErrors'を返す場合、' handleException'メソッドには '@ ResponseBody'が必要です。 – CorayThan

関連する問題