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

问题描述

|| 我有一个带有很少验证的表格。 在提交新表单期间,如果验证失败,我会看到这些错误消息。 但是,在编辑表单期间,当我有意将字段更改为空白并提交表单时,错误消息未显示在Jsp页面上,但是我可以在controller中将errorcount设为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>
我的编辑控制器方法..... 渲染编辑表单
@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()));

    }
} 它不是完整的代码,而是一个块 我已经尝试过几种方法, 将http方法从post更改为POST,但没有任何效果。验证在表单创建过程中完美起作用,但在编辑过程中无效。 我有什么想念的吗?请给我建议。 干杯 万世     

解决方法

保留验证错误消息可能真是麻烦! 我尝试了很多事情-从配置portlet容器的重定向行为到使用jsr303而不是spring验证。 我一直拥有并成功实现的唯一解决方案确实很丑陋: 在操作方法中进行验证。 如果遇到错误,请在Spring模型中使用\“ your own key \”保存BindingResult / Errors对象,并中断操作处理。 您将重定向到render方法 在那里,您可以拾取Errors对象,并将其放回到\“ Springvalidation \\”期望它的键处。 在代码中,看起来像这样:
@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。*”下存储在模型中的信息会在动作处理和渲染处理之间自动删除,并且通过在“错误”中显式保存,该信息将可用于视图。 这是一个丑陋的解决方案,您必须了解实现的真正工作原理,这是非常直观的,如果注释不正确,很容易被不熟悉此问题的人删除,但是此代码并不多的代码,它的工作原理。     ,您可以在渲染阶段省略
@ModelAttribute
并从模型中检索它:
@ActionMapping
public void invite(@ModelAttribute MyFormBean myFormBean,result);

    ...
}

@RequestMapping
public String showForm(Model model) {

    MyFormBean myFormBean = (MyFormBean)model.asMap().get(\"myFormBean\");
    ...

    return \"myForm\";
}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...