2010-10-06 77 views
4

所有的答案我都会在freemarker模板失败时显示我的验证错误。我使用Spring MVC的版本3.howto在freemarker模板中显示验证错误

我的形式看起来像

<@layout.basic> 
<@spring.bind "user" /> 
<#if spring.status.error> 
    <div class="errors"> 
     There were problems with the data you entered: 
     <ul> 
      <#list spring.status.errorMessages as error> 
       <li>${error}</li> 
      </#list> 
     </ul> 
    </div> 
<#else> 
    <div class="errors"> 
     There are no errors. 
    </div> 
</#if> 
<form action="" method="POST"> 
    <dl> 
     <dt>Login:</dt> 
      <dd><@spring.formInput "user.name" /> 
      <dd><@spring.showErrors "<br>" /> 
     <dt>E-Mail:</dt> 
      <dd><@spring.formInput "user.email" /> 
      <dd><@spring.showErrors "<br>" /> 
     <dt>Password:</dt> 
      <dd><@spring.formPasswordInput "user.passwort" /> 
      <dd><@spring.showErrors "<br>" /> 
     <dt>Password verification:</dt> 
      <dd><input type="password" name="passVerification"/> 
      <dd><@spring.showErrors "<br>" /> 
     <dt>Should the User have administrator rights?</dt> 
      <dd><input type="checkbox" name="isAdmin"/> 
      <dd><@spring.showErrors "<br>" /> 
     <br> 
      <dd><input type="submit" value="Create" /> 
    </dl> 
</form> 

我的基本布局看起来像

<#macro basic> 
<#-- needed for query spring security status --> 
<#assign security=JspTaglibs["http://www.springframework.org/security/tags"] /> 
<!DOCTYPE HTML> 
<html> 
    <head> 
     <title>Testform</title> 
    </head> 
    <body> 
     <div id=header> 
      <@security.authorize ifAnyGranted="ROLE_ADMIN"> 
       <a href='<@spring.url "/user/add" />'>Add user | </a> 
       <a href='<@spring.url "/user/manage" />'>Manage users | </a> 
      </@security.authorize>  
      <@security.authorize ifAnyGranted="ROLE_USER"> 
       <a href='<@spring.url "/job/add" />'>Add job | </a> 
       <a href='<@spring.url "/job/show" />'>Show jobs | </a> 
      </@security.authorize> 
     </div> 
     <div id=errors> 
     </div> 
     <div id=content> 
      <#nested> 
     </div> 
     <div id=footer> 
      <@security.authorize ifAnyGranted="ROLE_USER"> 
       <a href='<@spring.url "/j_spring_security_logout" />'>Logout</a> 
      </@security.authorize> 
     </div> 
    </body> 
</html> 
</#macro> 

我在servlet配置中定义的spring.ftl

<property name="freemarkerSettings"> 
    <props> 
     <prop key="auto_import">layout.ftl as layout, spring.ftl as spring</prop> 
    </props> 
</property> 

我的控制器看起来像这样

@RequestMapping(value = "/add", method = RequestMethod.POST) 
public String addUser(
     @RequestParam(value="isAdmin",defaultValue="false") Boolean isAdmin, 
     @RequestParam(value="passVerification") String passVerification, 
     @ModelAttribute("user") C_UserDAO newUser 
) { 
    final BindException errors = new BindException(newUser, "user"); 
    m_userValidator.validate(newUser, errors); 
    ... 
    if(!newUser.getPassword().equals(passVerification) && !newUser.getPassword().equals("")) { 
     errors.rejectValue("password", "user.password.missmatch", "The passwords aren't equal, try again"); 
    } 
    if(errors.hasErrors()) { 
     return "addUserForm"; 
    } 
    ... 
    return "redirect:thanks.html"; 
} 

验证用得好好的,但是当一个错误occures,认为没有变化,没有显示任何错误。我一遍又一遍地阅读文档,但是我找不到如何解决这个问题。我的错误是什么?

回答

13

我对FreeMarker并不熟悉,但我看到您的BindingResult与该模型没有关联。您需要将其添加到相应模型属性后的方法签名中:

@RequestMapping(value = "/add", method = RequestMethod.POST) 
public String addUser( 
     @RequestParam(value="isAdmin",defaultValue="false") Boolean isAdmin, 
     @RequestParam(value="passVerification") String passVerification, 
     @ModelAttribute("user") C_UserDAO newUser, 
     BindingResult errors 
) { 
    ... 
} 
+0

嘿,感谢您的快速回答,但我今天无法测试此代码。我会在下次尝试时再尝试。 – lofthouses 2010-10-06 15:38:54

+0

我测试了你的提示,它的工作原理!再次感谢:)如果我能,我会投票给你;) – lofthouses 2010-10-12 08:34:19