我正在尝试创建一个 Spring MVC 控制器,该控制器可以Player
使用 HTML 表单创建和编辑简单的域对象 (a)。最好以 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 的 servlet 过滤器,它似乎工作正常。
编辑2:
实验和修补表明我的控制器正在执行;PUT 的拒绝发生在我的控制器执行后。似乎 Spring 不喜欢对 PUT 的响应使用视图名称。