我正在用spring编写一个Web应用程序,我在表单验证方面遇到了问题。这是我第一次使用它,所以我仍然要理解它......
基本上我有一个带有表单处理方法的控制器:
@RequestMapping(params = "action=gestprodotti")
public ModelAndView doGestProdotti(
@RequestParam(value = "page", required = false, defaultValue = "0") int page,
@RequestParam(value = "activity", required = false) String activity,
@ModelAttribute Prodotto prod, BindingResult bindresult,
HttpSession session) throws Exception {
控制器已注释,不会扩展任何内容。在方法的后面,在收到绑定到表单的对象后,我这样做:
Validator valid = activityHandler.getValidator();
valid.validate(backingObject, bindresult);
if (bindresult.hasErrors()){
return handleRequest(action, ACTIVITY_NEW_ITEM, jspComponent,
page, itemId, backingObject, bindresult, appstatus);
}
这意味着我手动调用验证器并返回相同的表单页面(ModelAndView结果)。
验证码:
public static final class ProdottoValidator implements Validator{
@Override
public boolean supports(Class<?> other) {
return Prodotto.class.isAssignableFrom(other);
}
@Override
public void validate(Object obj, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "codice", "Il codice è richiesto");
}
}
和相关的JSP代码:
<td colspan="2" align="left">Codice<form:input id="code"
path="codice" /><form:errors path="codice" /></td>
适用于绑定,但我没有任何错误。我没有创建任何messages.properties文件,但我认为我应该看到一些东西。检测到错误是因为bindresult.hasErrors()
给出了true,但渲染的html没有显示任何代替表单的内容:错误。我错过了配置或其他什么?是因为没有一个不起作用的messages.properties文件吗?
答案 0 :(得分:1)
这是模型属性名称不匹配的典型症状。
模型属性名称在三个地方应该相同:
在表单设置方法中,您将表单对象的初始状态放入模型中。
在JSP页面的<form:form>
元素中。此处的默认名称为command
,可以使用modelAttribute
属性(或commandName
进行配置,这是相同的事情。)
在表单处理方法中,例如doGestProdotti
。默认名称被推断为参数类名称,第一个字母为decapitalized(在您的情况下为prodotto
)。您可以使用@ModelAttribute("..."
)明确指定名称。
点(2)和(3)之间的不匹配导致未显示验证错误。点(1)和(2)之间的不匹配会在显示表单时导致绑定错误。
因此,您需要将prodotto
配置为点(1)和(2)中的模型属性名称
<form:form modelAttribute = "prodotto" ...>
....
<form:errors path="codice" />
...
</form:form>
或将command
配置为第(3)行中的属性名称
@ModelAttribute("command") Prodotto prod
答案 1 :(得分:0)
如果您没有任何messages.properties文件,我希望日志中会出现错误消息,因为它无法在代码“Il codice e richiesto”下找到任何消息。