Spring MVC表单:错误未显示

问题描述:

如果此问题之前已被问过,请道歉。我希望有人能介入并帮我弄清楚为什么我的表单验证错误没有显示出来。Spring MVC表单:错误未显示

我使用的是Spring 3.0.3和Hibernate,我使用jsr-303验证来验证我的表单输入。我有一个Spring控制器,它可以处理GET页面,该页面包含一个借助Spring的表单taglib创建的表单。在这种形式下,用户可以更改他们的名字并将其保存到数据库中。如果任何输入为空,那么包含该表单的页面应该再次显示并显示错误消息。同一个控制器处理页面的提交。看起来控制器在大多数方面都能正常工作,但是当用户提交的表单出现错误时,页面上不会显示任何错误。

这里是什么看起来像形式:

<form:form commandName="changeNameCommand"> 
    <form:errors path="*" cssClass="errorBox" /> 

    <table width="100%" border="0" cellspacing="5" cellpadding="5" align="left"> 
     <tr> 
    <td><b>First Name:</b></td> 
    <td><form:input path="firstName" value="${user.firstName}" /></td> 
    </tr> 
    <tr> 
    <td><b>Last Name:</b></td> 
    <td> <form:input path="lastName" value="${user.lastName}" /></td> 
    </tr> 
</table> 
</form:form>  

注意,所以存在被用来填充与用户当前的姓和名的形式查看用户对象。这工作正常。

控制器看起来是这样的:

@Controller 
@RequestMapping(value = "/account/settings/change-name") 
@SessionAttributes("changeNameCommand") 
public class ChangeNameController { 

    @ModelAttribute("changeNameCommand") 
    public ChangeNameCommand getCommand() { 
     return new ChangeNameCommand(); 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public ModelAndView getChangeNamePage(HttpServletRequest req) { 
    ModelAndView mav = new ModelAndView("Account.ChangeName"); 
     mav.addObject("page_title", "Change Name"); 

     return mav; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String doChangeName(
       @ModelAttribute("changeNameCommand") 
        @Valid ChangeNameCommand command, 
        BindingResult result, SessionStatus status) { 

     if (result.hasErrors()) { 
      return "redirect:/account/settings/change-name"; 
     } 

    // Code here to persist updated user first and last name to database...   

     status.setComplete(); 

     return "redirect:/home"; 
    } 
} 

我使用Tiles 2.1.2撰写页面和Urlrewrite 3.1.0,帮助形成友好的URL。

的ChangeNameCommand类看起来是这样的:

import org.hibernate.validator.constraints.NotEmpty; 

public class ChangeNameCommand { 

    @NotEmpty(message = "You must provide a first name.") 
    private String firstName; 

    @NotEmpty(message = "You must provide a last name.") 
    private String lastName; 

    @NotEmpty(message = "Your password is required to make changes.") 
    private String currentPassword; 

    // Getters and setters here... 
} 

调试时,我看到,当没有对第一个或最后一个名字输入BindingResult实例确实包含错误。我担心的是在发生错误时重定向。我在这里看到其他问题,只是返回视图名称而不是使用重定向:前缀。我试过,但(我认为),因为我使用Urlrewrite的方式和我的servlet映射设置的方式Spring返回一个错误。我已经尝试过返回

/account/settings/change-name 
/web/account/settings/change-name 
/mywebsite/web/account/settings/change-name 

但无济于事。 FWIW,这里是我的servlet映射:

<servlet-mapping> 
    <servlet-name>mywebsite</servlet-name> 
    <url-pattern>/web/*</url-pattern> 
</servlet-mapping> 

任何帮助非常感谢!

这是我如何解决我的问题。首先,我不想放弃使用UrlRewriteFilter和Tiles。但是,问题在于,如果出现错误,我不能仅返回路径,如控制器RequestMapping注释中所示。下面是我的解决方案,在错误情况下删除了重定向,在doChangeName()

@Controller 
@RequestMapping(value = "/account/settings/change-name") 
@SessionAttributes("changeNameCommand") 
public class ChangeNameController { 

    @ModelAttribute("changeNameCommand") 
    public ChangeNameCommand getCommand() {   
     return new ChangeNameCommand(); 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public ModelAndView getChangeNamePage() { 
     ModelAndView mav = new ModelAndView("Account.ChangeName"); 
     mav.addObject("page_title", "Change Name"); 

     return mav; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public ModelAndView doChangeName(@ModelAttribute("changeNameCommand") @Valid ChangeNameCommand command, 
      BindingResult result, SessionStatus status) { 

     if (result.hasErrors 
      ModelAndView mav = new ModelAndView("Account.ChangeName"); 
      mav.addObject("page_title", "Change Name"); 

      return mav; 
     } 

     // Code here to persist updated user first and last name to database...   

     status.setComplete(); 

     RedirectView view = new RedirectView("/home"); 
     return new ModelAndView(view);   
    } 
} 

感谢所有帮助我的人!

使用redirect使所有的请求属性(包括错误和整个模型)消失。因此,请勿使用重定向,或使用会话临时存储数据或使用会话。或者弄清楚如何使用像闪光灯(我即将在一段时间内)

另一件事 - 使用UrlRewriteFilter与spring-mvc是不需要的。只有使用spring-mvc才能完全控制您喜欢的类似REST的URL。

+0

感谢Bozho。我如何更改我的代码以在会话中存储数据?我认为这种情况已经发生,但显然不是。谢谢! – richever 2010-10-03 18:52:14