2010-10-06 7 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> 

Я определил 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"; 
} 

Валидация работает как шарм, но когда встречается, ошибка, вид не изменяется и не показана ошибки. Я читал документацию снова и снова, но я не могу найти clou, как решить проблему. Какая у меня ошибка?

ответ

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

+0

Я проверил ваш намек, и он работает! Еще раз спасибо :) Если бы я мог, я бы проголосовал за вас;) – lofthouses