2017-10-31 7 views
1

私は春のMVCとリレーショナルデータベースを使用しています。 Springが書き込むテーブルの1つに、期待通りに機能する一意性制約があります。特定の例外が発生したときにHTTP 400応答を返すにはどうすればよいですか?

現在、その制約に違反する要求が出された場合、例外org.springframework.dao.DuplicateKeyExceptionがスローされ、HTTP 500応答(内部サーバーエラー)が返されますが、実際にはシステムに問題はありませんが、ユーザーの要求があります。

例外をキャッチしてHTTP 400(不良リクエスト)を返す最も自然な方法は何ですか?私は実際にそれをキャッチすることができます:

@RequestMapping(value = "/", method = RequestMethod.POST) 
public ResponseEntity<BaseMaterial> insert(@RequestBody BaseMaterial baseMaterial) { 
    try {   
     baseMaterial.setId(UUID.randomUUID()); 
     baseMaterialService.insert(baseMaterial); 
     return ResponseEntity.ok(baseMaterial); 
    } catch (DuplicateKeyException e) { 
     return ResponseEntity.badRequest().build(); 
    } 
} 

しかし、私はそれを私のエンドポイントごとに行う必要があります。私はまた、ResponseEntityラッパーなしのPOJOだけを使用することを好むでしょう。

ありがとうございます!

+0

は '@ ControllerAdvice'を使用します。 –

答えて

1

実際にはシステム/サーバーに問題があるかもしれません。私はあなたが挿入する前に重複を確認する必要があると思います。指定された一意のフィールドを持つ行がすでに存在するかどうかを確認し、trueの場合は例外をスローします。

+0

私はそれについても考えましたが、私はそれには2つのデータベース呼び出しと1つが必要だと思っていました.DBに重複があると教えてもらうことは大丈夫です。 –

+0

しかし、ユニークな制約のために残りの呼び出しが何度も失敗することは望ましくありません(ユーザーは愚かかもしれません)。それは巨大な厄介な例外です。あなたはそれを処理し、そのような種類の例外を避けて、あなたが何が起こっているのかを担当するようにしてはいけません。私の英語のために申し訳ありませんが、私はあなたが理解してほしい:) – MatMat

1

私自身の質問に答えるのは私の謝罪ですが、私が見つけたのはlooking for on spring's blogでした。あなたのコントローラクラスで

、目的の例外がスローされたときに実行され、ExceptionHandlerResponseStatusでそれに注釈を付けますメソッドを作成:

@ExceptionHandler(DuplicateKeyException.class) 
@ResponseStatus(value = HttpStatus.CONFLICT, reason = "Data integrity violation") // 409 
public void conflict() { 
    // code goes here 
} 

をそして、それはそれです。他の変更はありません!

関連する問題