2012-03-28 17 views
2

新しいrooプロジェクトが正常に終了しましたが、今はログインページの検証に問題があります。バリデーターがコントローラに制御を渡す前に、バリデータが窒息しているようです。私は決してBindingResultをチェックする機会を与えられません。私はいくつかの似たような質問をウェブ上で調べました。私のコードは自分が行っていることに合っているようです。春@Validバリデーターが正しく呼び出されない(Roo、Hibernate)

最初にフォームを送信するときにエラーが発生します(検証に合格するとエラーメッセージは表示されません)。この場合、私は、パスワードの最小長を満たしていませんでした:

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

それが重要念のD、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"/> 

は時間の私の髪を引っ張ってきて、私はそれが何ができるかを把握することはできません。読んでくれてありがとう!

+0

なぜSpring Securityアドオンを使用しなかったのですか? – bhagyas

+3

単にスプリングセキュリティを使用するものではありません。 –

答えて

13

コントローラのハンドラメソッドで、BindingResult引数をコマンド引数の直後に移動してみます。 Springは、ハンドラメソッドのシグネチャでペアになるコマンドオブジェクトパラメータとBindingResultパラメータを探します。

+0

問題ありません。また、メソッドシグネチャに複数のコマンドオブジェクトがある場合は、それぞれに独自のBindingResultが続かなければならないことに注意してください。つまり、ペアで移動する必要があります。 –