Player
HTML フォームを使用して単純なドメイン オブジェクト (a) の作成と編集を可能にする Spring MVC コントローラーを作成しようとしています。できれば RESTful な方法で。送信されたフォームにエラーがあると、編集で問題が発生しました。クライアント (ブラウザー) にエラー メッセージと元のフォームを表示して、ユーザーが修正して再送信できるようにしたい。
しかし、私はそれを機能させることができません。エラーが発生すると、Web アプリケーションに元のフォームを再表示させることができますが、エラー メッセージは表示されません。その場合、コードがフォームページにリダイレクトされるためだと思います。リダイレクトを削除しようとしましたが、Web サーバーPUT
はリソースに対して許可されていないと文句を言います。私は何をする必要がありますか?
私のコントローラーに関連するコードは次のとおりです。
@Controller
@RequestMapping({
"/player"
})
public class PlayerController {
@RequestMapping(value = "/{id}/edit", method = RequestMethod.PUT)
public String editPlayer(@PathVariable("id")
final long id, @Valid
@ModelAttribute(Model.PLAYER)
final PlayerModel player, final BindingResult result) {
if (!result.hasErrors()) {
final Player playerEntity = playerService.find(id);
playerEntity.setName(player.getName());
playerService.update(playerEntity);
return "redirect:/player/" + id;
} else {
return "redirect:/player/" + id + "/edit";
}
}
@RequestMapping(value = "/{id}/edit", method = RequestMethod.GET)
public String showEditPlayerPage(@PathVariable("id")
final long id, final org.springframework.ui.Model model) {
createModel(id, model);
return View.EDIT_PLAYER;// the player editing page
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String showPlayerPage(@PathVariable("id")
final long id, final org.springframework.ui.Model model) {
// ...
return View.PLAYER;// the read-only view of a player
}
// Other code
}
に JSR-303 検証アノテーションがあり、が短すぎたり長すぎたりPersonModel
すると検証エラーが発生します。name
編集フォームの HTML は次のとおりです。
<form:form commandName="player" method="PUT">
<fieldset>
<table>
<tr>
<th><label for="player_name">Player Name:</label></th>
<td><form:input path="name" size="64" maxlength="64"
id="player_name" /> <br /> <small
id="player_name_msg">Not empty, but no more
than 64 characters.</small> <form:errors path="name"
class="error" /></td>
</tr>
</table>
<input type="submit" value="Submit"></input>
</fieldset>
</form:form>
編集:
明確にするために、フォームが有効な場合はすべて正常に機能します。PUT を POST に変換するためのサーブレット フィルターがあり、正常に動作しているようです。
編集2:
実験と調整により、コントローラーが実行されていることがわかりました。PUT の拒否は、コントローラーの実行後に発生します。Spring は、PUT への応答にビュー名を付けたくないようです。