问题描述
||
我有一个带有很少验证的表格。
在提交新表单期间,如果验证失败,我会看到这些错误消息。
但是,在编辑表单期间,当我有意将字段更改为空白并提交表单时,错误消息未显示在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\";
}