【问题标题】:Spring @Valid annotationSpring @Valid 注解
【发布时间】:2014-07-11 07:25:24
【问题描述】:

我有表格:

<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>

Action = /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、@Range、@Min、@Max 注释(其中任何一个)时,例如,我使用一个符号(大小)在页面上填写用户名和电子邮件输入,长度,最小注释必须验证输入中的符号计数)并按下提交按钮 - 在调试日志中我看到 bindingresult 包含错误,但我的控制器方法 registerUser 没有调用 - 而不是这个我得到 HttpError 502 BadGateway 和空白页 -我的控制器的方法没有调用。

怎么了?

更新: 我确实没有 502 BadGateway,我在控制器中有一个异常,因为 FieldErrors at Length 注释。

【问题讨论】:

  • 如果你使用表单,为什么在你的控制器方法中你有headers = "Accept=application/json",为什么你在UserDto userDto之前没有@ModelAttribute?并且 BindingResul 参数应该紧跟在它之后,而不是在请求参数之后。
  • 首先,如果我使用@Valid,我不能使用@ModelAttribute。然后,作为答案发布BindingResult 必须紧跟在@Valid 之后,而不是在请求参数之后 - 这就是答案!一切正常!谢谢!

标签: java spring validation spring-mvc


【解决方案1】:

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

在你的情况下,你应该写:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2015-01-04
      • 1970-01-01
      • 2022-01-01
      相关资源
      最近更新 更多