私のコントローラーアクションコードは次のようになります。
def addIngredient() = Action { implicit request =>
val boundForm = ingredientForm.bindFromRequest
boundForm.fold(
formWithErrors => BadRequest(views.html.Admin.index(formWithErrors)),
value => {
Async {
val created = Service.addIngredient(value.name, value.description)
created map { ingredient =>
Redirect(routes.Admin.index()).flashing("success" -> "Ingredient '%s' added".format(ingredient.name))
}
// TODO on exception do the following
// BadRequest(views.html.Admin.index(boundForm.copy(errors = Seq(FormError("", ex.getMessage())))))
}
})
}
My Service.addIngredient(...)はPromise [Ingredient]を返しますが、カスタムValidationExceptionをスローすることもできます。この例外がスローされた場合、コメント化されたコードを返したいと思います。
現在、ページは500としてレンダリングされ、ログには次のように表示されます。
play-約束を待っていますが、エラーが発生しました:「test」という名前の材料はすでに存在します。services.ValidationException:「test」という名前の成分はすでに存在します。
2つの質問:
- 私のサービスからこの例外を返すのは悪い考えですか?このケースを処理するためのより良い/よりスカラな方法はありますか?
- 例外をキャッチするにはどうすればよいですか?