【问题标题】:Spring form validation problemsSpring表单验证问题
【发布时间】:2011-06-21 05:58:00
【问题描述】:

我正在使用 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 没有显示任何内容来代替 form:errors。我是否缺少诸如配置之类的东西?是不是因为没有messages.properties文件不起作用?

【问题讨论】:

    标签: forms spring-mvc


    【解决方案1】:

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

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

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

    2. 在 JSP 页面的 &lt;form:form&gt; 元素中。这里默认名称是command,可以使用modelAttribute属性配置(或者commandName,都是一样的)。

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

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

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

    <form:form modelAttribute = "prodotto" ...>
        ....
        <form:errors path="codice" />
        ...
    </form:form>
    

    或者在第(3)点配置command作为属性名

    @ModelAttribute("command") Prodotto prod
    

    【讨论】:

    • 默认应该是文档所说的“命令”。如您所说,使用 prodotto 会导致绑定错误。你确定吗?
    • @ModelAttribute 没有得到 name 属性,我得到一个错误。 prodotto in form:form 破坏绑定并导致异常...
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 2014-08-16
      • 2015-04-23
      • 2013-01-01
      • 1970-01-01
      • 2011-07-17
      相关资源
      最近更新 更多