Forms Spring表单验证问题

Forms Spring表单验证问题,forms,spring-mvc,Forms,Spring Mvc,我正在用spring编写一个web应用程序,但在表单验证方面遇到了问题。这是我第一次使用它,所以我仍然需要理解它 基本上,我有一个具有表单处理方法的控制器,即: @RequestMapping(params = "action=gestprodotti") public ModelAndView doGestProdotti( @RequestParam(value = "page", required = false, defaultValue = "0") i

我正在用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");           
        }

    }
公共静态最终类ProdottoValidator实现验证器{
@凌驾
公共布尔支持(类其他){
返回Prodotto.class.isAssignableFrom(其他);
}
@凌驾
公共无效验证(对象对象,错误){
ValidationUtils.rejectIfEmptyOrWhitespace(错误,“codice”,“Il codiceèrichiesto”);
}
}
以及相关的JSP代码:

<td colspan="2" align="left">Codice<form:input id="code"
                path="codice" /><form:errors path="codice" /></td>
Codice

这对于绑定很好,但我没有得到任何错误。我没有创建任何messages.properties文件,但我想我还是应该看到一些东西。检测到错误是因为
bindresult.hasErrors()
提供了true,但呈现的html没有显示任何形式的错误。我是否缺少配置之类的东西?是因为没有messages.properties文件,所以它不能工作吗?

如果没有任何messages.properties文件,我希望日志中会出现错误消息,因为它在代码“Il codice e richiesto”下找不到任何消息。

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

模型属性名称应在三个位置相同:

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

  • 在JSP页面的
    元素中。这里的默认名称是
    command
    ,可以使用
    modeldattribute
    属性配置它(或者
    commandName
    ,这是一样的)

  • 表单中的处理方法,例如您的
    doGestProdotti
    。默认名称被推断为参数类名,第一个字母为无头(
    prodotto
    )。您可以使用
    @modeldattribute(“…”
    )显式指定名称

  • 点(2)和点(3)之间的不匹配会导致验证错误不显示。显示表单时,点(1)和点(2)之间的不匹配会导致绑定错误

    因此,您需要将
    prodotto
    配置为点(1)和(2)中的模型属性名称


    默认值应该是文档中所说的“command”。正如您所说,使用prodotto会导致绑定错误。你确定吗?@modeldattribute没有name属性,我得到一个错误。表单中的prodotto:表单破坏绑定并导致异常。。。
    <form:form modelAttribute = "prodotto" ...>
        ....
        <form:errors path="codice" />
        ...
    </form:form>
    
    @ModelAttribute("command") Prodotto prod