【问题标题】:Spring @Valid validator not invoked properly (Roo, Hibernate)Spring @Valid 验证器未正确调用(Roo,Hibernate)
【发布时间】:2012-03-28 22:32:56
【问题描述】:

我成功启动了一个新的 roo 项目,但现在我在验证登录页面时遇到了问题。在将控制权传递给我的控制器之前,验证器似乎窒息了。我从来没有机会检查 BindingResult。我在这里和网络上检查了几个类似的问题,我的代码似乎符合他们正在做的事情。

首先是我在提交表单时遇到的错误(如果我通过验证,我不会收到任何错误消息)。在这种情况下,我没有达到密码的最小长度:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'loginUser' on field 'password': rejected value [b]; codes [Size.loginUser.password,Size.password,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [loginUser.password,password]; arguments []; default message [password],50,5]; default message [Password must be between 1  and 50 characters long]
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)

我的实体验证设置如下:

public class LoginUser {

    @NotNull
    @NotEmpty
    private String username;

    @NotNull
    @NotEmpty(message = "Password must not be blank.")
    @Size(min = 5, max = 50, message = "Password must be between 1 " 
            + " and 50 characters long")
    private String password;
}

这是我的标记:

<form:form method="post" commandName="command">
    <form:label path="username">Username: </form:label>
    <form:input path="username"/>
    <form:errors path="username"/>

    <form:label path="password">Password: </form:label>
    <form:password path="password"/>
    <form:errors path="password"/>

    <input type="submit"/>
</form:form>

还有控制器:

    @ModelAttribute("command")
    public LoginUser fbo(){
        LoginUser u = new LoginUser();
        u.setUserType(UserType.USER);
        return u;
    }

    @RequestMapping(value="/login.htm", method=RequestMethod.POST)
    public String doLogin(@Valid LoginUser command, 
            HttpServletRequest request, BindingResult result
        ){
        if(result.hasErrors()){
            return "login";
        }
    }

为了以防万一,webmvc-config.xml中生成的xml:

<!-- The controllers are autodetected POJOs labeled with the @Controller annotation. -->
<context:component-scan base-package="com.tcg.myproject" use-default-filters="false">
    <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>

<!-- Turns on support for mapping requests to Spring MVC @Controller methods
     Also registers default Formatters and Validators for use across all @Controllers -->
<mvc:annotation-driven conversion-service="applicationConversionService"/>

我已经拉了好几个小时的头发,但我不知道它可能是什么。感谢阅读!

【问题讨论】:

  • 你为什么不简单地使用 Spring Security 插件?
  • 不能简单地使用spring security。

标签: spring validation spring-roo


【解决方案1】:

在您的控制器处理程序方法中,尝试移动 BindingResult 参数,使其紧跟在命令参数之后。 Spring 查找要在处理程序方法签名中配对的命令对象参数和 BindingResult 参数。

【讨论】:

  • 没问题。另请注意,如果您在方法签名中有多个命令对象,则每个命令对象后面都应该有自己的 BindingResult - 即它们必须成对传播。
猜你喜欢
  • 2015-05-01
  • 1970-01-01
  • 2016-10-17
  • 2011-05-19
  • 2013-08-12
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多