抱歉,如果以前有人问过这个问题。我希望有人可以介入并帮助我弄清楚为什么我的表单验证错误没有出现。
我正在使用 Spring 3.0.3 和 Hibernate,并且正在使用 jsr-303 验证来验证我的表单输入。我有一个 Spring 控制器,它处理 GETting 一个页面,该页面包含一个在 Spring 的表单 taglib 的帮助下创建的表单。在这种形式中,用户可以更改他们的名字并将其保存到数据库中。如果任何输入为空,则应再次显示带有表单的页面并显示错误消息。同一个控制器处理页面的提交。似乎控制器在大多数方面都正常运行,但是当用户提交的表单中出现错误时,页面上不会显示任何错误。
这是表格的样子:
<form:form commandName="changeNameCommand">
<form:errors path="*" cssClass="errorBox" />
<table width="100%" border="0" cellspacing="5" cellpadding="5" align="left">
<tr>
<td><b>First Name:</b></td>
<td><form:input path="firstName" value="${user.firstName}" /></td>
</tr>
<tr>
<td><b>Last Name:</b></td>
<td> <form:input path="lastName" value="${user.lastName}" /></td>
</tr>
</table>
</form:form>
请注意,视图中有一个用户对象,用于使用用户当前的名字和姓氏填充表单。这工作正常。
控制器看起来像这样:
@Controller
@RequestMapping(value = "/account/settings/change-name")
@SessionAttributes("changeNameCommand")
public class ChangeNameController {
@ModelAttribute("changeNameCommand")
public ChangeNameCommand getCommand() {
return new ChangeNameCommand();
}
@RequestMapping(method = RequestMethod.GET)
public ModelAndView getChangeNamePage(HttpServletRequest req) {
ModelAndView mav = new ModelAndView("Account.ChangeName");
mav.addObject("page_title", "Change Name");
return mav;
}
@RequestMapping(method = RequestMethod.POST)
public String doChangeName(
@ModelAttribute("changeNameCommand")
@Valid ChangeNameCommand command,
BindingResult result, SessionStatus status) {
if (result.hasErrors()) {
return "redirect:/account/settings/change-name";
}
// Code here to persist updated user first and last name to database...
status.setComplete();
return "redirect:/home";
}
}
我正在使用Tiles 2.1.2来撰写页面,并使用Urlrewrite 3.1.0来帮助形成友好的 url。
ChangeNameCommand 类看起来像这样:
import org.hibernate.validator.constraints.NotEmpty;
public class ChangeNameCommand {
@NotEmpty(message = "You must provide a first name.")
private String firstName;
@NotEmpty(message = "You must provide a last name.")
private String lastName;
@NotEmpty(message = "Your password is required to make changes.")
private String currentPassword;
// Getters and setters here...
}
调试时,我看到当没有输入名字或姓氏时,BindingResult 实例确实包含错误。我担心的是出现错误时的重定向。我在这里看到了其他问题,它们只是返回视图名称而不是使用 redirect: 前缀。我试过了,但是(我认为)因为我使用 Urlrewrite 的方式和我的 servlet 映射的设置方式 Spring 返回一个错误。我试过回来
/account/settings/change-name
/web/account/settings/change-name
/mywebsite/web/account/settings/change-name
但无济于事。FWIW,这是我的 servlet 映射:
<servlet-mapping>
<servlet-name>mywebsite</servlet-name>
<url-pattern>/web/*</url-pattern>
</servlet-mapping>
非常感谢任何帮助!