Spring表单验证问题

时间:2011-02-04 09:22:41

标签: forms spring-mvc

我正在用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文件吗?

2 个答案:

答案 0 :(得分:1)

这是模型属性名称不匹配的典型症状。

模型属性名称在三个地方应该相同:

  1. 在表单设置方法中,您将表单对象的初始状态放入模型中。

  2. 在JSP页面的<form:form>元素中。此处的默认名称为command,可以使用modelAttribute属性(或commandName进行配置,这是相同的事情。)

  3. 在表单处理方法中,例如doGestProdotti。默认名称被推断为参数类名称,第一个字母为decapitalized(在您的情况下为prodotto)。您可以使用@ModelAttribute("...")明确指定名称。

  4. 点(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”下找到任何消息。