我有一个表单,上面几乎没有验证。 在提交新表单期间,如果验证失败,我可以看到这些错误消息。 但是,在编辑表单期间,当我故意将字段更改为空白并提交表单时,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/