Spring portlet mvc 提交编辑表单期间验证失败

标签 spring validation model-view-controller portlet

我有一个表单,上面几乎没有验证。 在提交新表单期间,如果验证失败,我可以看到这些错误消息。 但是,在编辑表单期间,当我故意将字段更改为空白并提交表单时,Jsp 页面上不会显示错误消息,但我可以在 Controller 中获取错误计数 1 。

<portlet:actionURL var="actionUrl">
    <portlet:param name="action" value="editCommunity"/>
    <portlet:param name="communityID" value="${community.id}"/>
</portlet:actionURL>

<liferay-ui:tabs names="Details" />

<form:form commandName="community" method="post" action="${actionUrl}">
    <form:hidden path="id"/>

    <div><form:errors cssClass="portlet-msg-error" path="*"/></div>

    <table class="manager-detail">
        <tr>
            <th class="portlet-form-field-label">
                <label for="community_label_name"><spring:message code="community.label.name"/></label>         
                <span class="manager-field-required">*</span>
            </th>
            <td><form:input id="community_label_name" cssClass="portlet-form-input-field" path="name" size="30" maxlength="80" /></td>
        </tr>

我的编辑 Controller 方法......

渲染编辑表单

@RequestMapping(params = "action=editCommunity")
public String showEditCommunityForm(final RenderRequest request,
        @RequestParam(value="communityID") Long id, final Model model)
        throws CommunityNotFoundException {
    final ThemeDisplay themeDisplay = (ThemeDisplay) request
            .getAttribute(WebKeys.THEME_DISPLAY);

    model.addAttribute("community", communityService.getCommunity(id));


    return "communityEdit";
}

编辑后的表单已提交

@RequestMapping(params = "action=editCommunity")
public void submitEditCommunityForm(final ActionRequest request,
        final ActionResponse response,
        @ModelAttribute("community") Community community,
        BindingResult result, Model model) throws SystemException, PortalException {

    communityValidator.validate(community, result);
    if (result.hasErrors()) {
        System.out.println("validation errors size..."+result.getErrorCount());
        //model.addAttribute("community", community);
        response.setRenderParameter("action", "editCommunity");
        response.setRenderParameter("communityID", String.valueOf(community
                .getId()));

    }

}

这不是完整的代码,而是一个 block

我尝试过一些事情,比如 将 http 方法从 post 更改为 POST,但没有任何效果。验证在表单创建期间完美运行,但在编辑期间则不然。

我错过了什么吗?请给我建议。

干杯 瓦姆希

最佳答案

保留验证错误消息可能真的很痛苦! 我尝试了很多事情 - 从配置 portlet 容器的重定向行为到使用 jsr303 而不是 spring 验证。

我一直拥有且成功实现的唯一解决方案确实很丑陋:

  • 在操作方法中进行验证。
  • 如果遇到错误,请在 Spring 模型中使用“您自己的 key ”保存 BindingResult/Errors 对象并中断操作处理。
  • 您将被重定向到渲染方法
  • 在那里,您拾取 Errors 对象并将其放回“Spring 验证”期望的键中。

在代码中,这看起来像这样:

@ActionMapping
public void invite(@ModelAttribute MyFormBean myFormBean,
                   BindingResult result, Model model) {
    // validate indata
    myValidator.validate(myFormBean, result);

    // Workaround to preserve Spring validation errors
    if (result.hasErrors()) {
        model.addAttribute("errors", result);
        return;
    }
    ...
}

@RequestMapping
public String showForm(@ModelAttribute("myFormBean") MyFormBean myFormBean, 
                       Model model) {
    ...

    // Workaround to get the errors form-validation from actionrequest
    Errors errors = (Errors) model.asMap().get("errors");
    if (errors != null) {
       model.addAttribute(
          "org.springframework.validation.BindingResult.myFormBean", errors);
    }

    return "myForm";
 }

存储在“org.springframework.validation.BindingResult.*”下的模型中的信息会在操作处理和渲染处理之间自动删除,并且通过在“错误”中显式保留该信息,该信息将可供 View 使用.

这是一个丑陋的解决方案,你必须比你想要的更多地了解实现的真正工作原理,这是违反直觉的,如果没有正确注释,这段代码很容易被不熟悉问题的人删除,但它是代码不多并且可以工作。

关于Spring portlet mvc 提交编辑表单期间验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6140659/

相关文章:

java - 在 Spring MVC 中线程化 for 循环

java - 用于选择特定列的 Spring Data JPA 规范

ruby-on-rails-3 - Rails 3 验证,多个字段

java - MySQL数据库不写入

java - 部署一个简单的 Spring MVC 应用程序(没有 web.xml)后出现 404 错误

javascript - jQuery .text 不工作

php - Silverstripe 条件验证

c# - 有人可以帮助我理解以下行吗?

model-view-controller - 市场上最好的MVC Web框架是什么?

model-view-controller - Symfony 2 : Dependency injection (DI) of Controllers