在Freemarker模板中显示Spring MVC验证错误

时间:2011-09-26 14:33:43

标签: spring model-view-controller validation freemarker

如果控制器返回绑定错误,我正试图在我的freemarker模板中显示全局验证错误列表。我可以显示与字段关联的错误,但我想检测特定bean中何时发生错误并在页面顶部显示消息。我尝试使用下面没有输出的例子:

<@spring.bind "webPage" />
....
<#if spring.status.error>
There were problems with the data you entered:
<ul>
<#list spring.status.errorMessages as error>
<li>${error?html}</li>
</#list>
</ul>
</#if>

尽管提交的表单存在错误,但下面的行始终返回0:

${spring.status.errorMessages?size}

我的控制器代码如下:

@RequestMapping(method = RequestMethod.POST)
public ModelAndView save(@ModelAttribute("webPage") @Valid WebPage page, BindingResult result, Model model) {
    if (!model.containsAttribute("site")) {
        throw new IllegalArgumentException("Model must contain site attribute.");
    }
    Site site = (Site) model.asMap().get("site");
    if (!result.hasErrors() && !page.isNew()) {
        this.pageService.save(page, site);
    } else if (!result.hasErrors() && page.isNew()) {
        this.pageService.create(page, site);
    } 
    return createMav(result);
}

createMav方法如下:

public ModelAndView createMav(BindingResult result) {
    ModelAndView mav = new ModelAndView();
    mav.setViewName(getPrimaryControllerView());
    mav.addAllObjects(result.getModel());
    return mav;
}

有没有办法使用Freemarker + Spring MVC来实现这个目标?

4 个答案:

答案 0 :(得分:3)

我找到了一种使用标准MVC JSP taglib的迂回方式。我将它提供给Freemarker:

<#assign form=JspTaglibs["http://www.springframework.org/tags/form"] />

然后我使用以下宏来显示全局错误消息:

<#macro formErrors>
    <#assign formErrors><@form.errors path="*" /></#assign>
    <#if formErrors?has_content>
        <div id="errors">
            <@spring.message "admin.error.globalMessage" />
        </div>
    </#if>
</#macro>

我只是将以下行放在我希望出现此错误消息的地方(这必须包含在提交给控制器的表单元素中):

<@form.form method="POST" commandName="webPage">

            <@formErrors />                        
            ....
</@form.form>

答案 1 :(得分:1)

您可以写如下:

<#if spring.status.error>
<ul>
   <#list spring.status.errors.globalErrors as error>
   <li>${error.defaultMessage}</li>   
   </#list>
</ul>
</#if>

BindStatusErrors类的更多信息。

答案 2 :(得分:1)

尝试这样的事情:

<@spring.bind "webPage" />
<#if (spring.status.errors.allErrors?size > 0) >
    <@spring.message "my.global.error.code"/>
</#if>

答案 3 :(得分:0)