2012-03-28 8 views
2

Ich habe ein neues Roo-Projekt erfolgreich gestartet, aber jetzt habe ich ein Problem, die Validierung für eine Login-Seite zu arbeiten. Es scheint, dass der Validator erstickt, bevor er die Kontrolle an meinen Controller übergibt. Ich habe nie die Möglichkeit, das BindingResult zu überprüfen. Ich habe einige ähnliche Fragen hier und im Internet untersucht, und mein Code scheint mit dem übereinzustimmen, was sie tun.Spring @ Valid Validator nicht korrekt aufgerufen (Roo, Hibernate)

Zuerst der Fehler, den ich beim Absenden des Formulars bekomme (wenn ich die Validierung überlasse, erhalte ich keine Fehlermeldung). In diesem Fall traf ich nicht die Mindestlänge für das Passwort:

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) 

Meine Einheit Validierung ist Setup wie folgt aus:

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

Hier ist mein Markup:

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

Und die Steuerung:

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

An d nur für den Fall es darauf ankommt, die erzeugte XML in webmvc-config.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"/> 

, meine Haare stundenlang ziehen, und ich kann es konnte nicht herausfinden, was sein. Danke fürs Lesen!

+0

Warum haben Sie das Spring Security-Add-on nicht einfach verwendet? – bhagyas

+3

Man verwendet nicht einfach Federsicherung. –

Antwort

13

Versuchen Sie in Ihrer Controller-Handler-Methode, das BindingResult-Argument so zu verschieben, dass es unmittelbar hinter dem Befehlsargument liegt. Spring sucht nach Befehlsobjektparametern und BindingResult-Parametern, die in Handlerverfahrensignaturen verknüpft werden sollen.

+0

Kein Problem. Beachten Sie außerdem Folgendes: Wenn Sie mehrere Befehlsobjekte in der Methodensignatur haben, sollte jedem ein eigenes BindingResult folgen - d. H., Sie müssen paarweise reisen. –

Verwandte Themen