Валидатор Spring @Valid не вызывается должным образом (Roo, Hibernate) - PullRequest
2 голосов
/ 29 марта 2012

Я успешно запустил новый проект 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";
        }
    }

И на всякий случай, сгенерированный xml в 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"/>

Я тяну свои волосы часами, и я не могу понять, что это может быть. Спасибо за чтение!

1 Ответ

13 голосов
/ 29 марта 2012

В вашем методе обработчика контроллера попробуйте переместить аргумент BindingResult так, чтобы он был сразу после аргумента команды.Spring ищет параметры объекта команды и параметры BindingResult для сопряжения в сигнатурах методов-обработчиков.

...