Spring @Valid注释

时间:2014-07-11 07:25:25

标签: java spring validation spring-mvc

我有表格:

<form:form id="my-registration-form" method="post" commandName="userDTO" modelAttribute="userDTO" action="/index/register.do">
        <p class="error">
            <form:errors path="*" cssClass="errorblock" element="div" />
        </p>
        <p>
            <form:input path="username" />
            <form:errors path="username" cssClass="error" />
            <%--<input type="text" id="username" name="username" placeholder="Username" value="">--%>
        </p>
        <p>
            <form:input path="email" />
            <form:errors path="email" cssClass="error" />
            <%--<input type="text" id="email" name="email" placeholder="Email" value="">--%>
        </p>
        <p class="submit">
            <input type="submit" class="button" value="Register">
        </p>
    </form:form>

动作= /index/register.do

    @RequestMapping(value = "/register.do", headers = "Accept=application/json", method = RequestMethod.POST)
public String registerUser(@Valid UserDTO userDTO, HttpServletRequest request,
                           BindingResult result, RedirectAttributes attributes) {

    if (result.hasErrors()) {
        return "error"
    }
}

我的模特UserDTO:

    public class UserDTO {

        private String uuid;

        @NotEmpty(message = "This field req")
        @Length(min = 6, max = 30, message = "6 or 30")
        protected String username;

        protected String password;

        @NotEmpty(message = "Email required")
        @Email(message = "Enter good email")
        protected String email;
    }

所以我的问题是:当我离开@NotEmpty注释时 - 在页面上我按下带有空输入的提交按钮 - 一切正常,我的控制器方法registerUser被调用,看到错误并正常工作。但是当我在任何字段的UserDTO类中添加@ Email,@ Size,@ Length,@ Land,@ Min,@ Max注释(其中任何一个)时,例如我在页面上使用一个符号填充用户名和电子邮件输入(大小) ,长度,最小注释必须验证输入中的符号计数)并按下提交按钮 - 在调试日志中我看到bindingresult包含错误,但我的控制器方法registerUser没有调用 - 而不是这个我得到了HttpError 502 BadGateway和空白页 - 我的控制器的方法没有调用。

怎么了?

更新 我确实没有502 BadGateway,我在Controller中有一个异常,因为在Length注释中有FieldErrors。

2 个答案:

答案 0 :(得分:5)

在Spring参考手册中明确指出,在MVC控制器的RequestMapping注释方法中,BindingResult参数必须紧跟其引用的参数。

在你的情况下你应该写:

public String registerUser(@Valid UserDTO userDTO, BindingResult result,
           HttpServletRequest request, RedirectAttributes attributes) {

答案 1 :(得分:1)

BindingResult result 方法参数必须紧跟在方法参数列表中的表单bean之后。