如果以前曾问过这个问题,我们深表歉意。我希望有人可以介入并帮助我找出为什么我的表单验证错误没有出现。

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

表格如下所示:

<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";
    }
}

我在用着 瓷砖2.1.2 撰写页面并 网址重写3.1.0 帮助形成友好的网址。

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>

非常感谢任何帮助!

有帮助吗?

解决方案 2

这是我解决问题的方法。首先,我不想放弃对 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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top