Проверка Spring 3 не работает - PullRequest
9 голосов
/ 03 июня 2011

В моем приложении есть пользовательский объект, который мне нужно проверить.

public class User {

private String userName;
private String password;

public void setUserName(String userName){
this.userName = userName;
}

public getUserName(){
return this.userName;
}   

// and so on 

}

Для этого я создал UsersValidator, как показано ниже.

public class UserValidator implements Validator {

public boolean supports(Class clazz) {
    return User.class.equals(clazz);
}

public void validate(Object obj, Errors errors) {
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "field.required");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "field.required");
}
}

, и у меня есть такой контроллер

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String home(@Valid User user,
        BindingResult result) {

    if (result.hasErrors()) {
        return "loginForm";
    } else {
    //continue
}

}

Результат привязки не имеет ошибок.

Что еще мне нужно сделать, чтобы проверка работала?Нужно ли вносить какие-либо изменения в контроллер или файл конфигурации пружины.

<mvc:annotation-driven />

<context:component-scan base-package="com.myapp" />

<mvc:resources location="/resources/" mapping="/resources/**" />

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass">
        <value>org.springframework.web.servlet.view.tiles2.TilesView</value>
    </property>
</bean>

<bean id="tilesConfigurer"
    class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/tiles.xml</value>
        </list>
    </property>
</bean>

<bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>com/dimex/resourceBundles/ApplicationResources</value>
            <value>com/dimex/resourceBundles/errors</value>
        </list>
    </property>            
  </bean>

<mvc:interceptors>  
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="locale"></property>
    </bean>
</mvc:interceptors>

<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale" value="en" />
</bean>

РЕДАКТИРОВАТЬ: -

Нужно ли иметь валидатор гибернации в моем пути к классам.Мы не используем Hibernate в нашем приложении.Пожалуйста, помогите.

EDIT2: -

Когда я использую аннотации проверки (@NotNull, @Size и т. Д.) Непосредственно в моем классе сущности, тогда аннотации @Valid в контроллере работают, ноесли я удаляю их из своих сущностей и пытаюсь использовать валидатор, написанный выше, то @Valid не работает.

Разве аннотации @Valid работают только с аннотацией валидации только в сущностях, а не с валидаторами?Для того, чтобы использовать мои валидаторы, мне придется напрямую вызывать метод validate в моем валидаторе?

Ответы [ 5 ]

14 голосов
/ 07 июня 2011

Насколько я понимаю, вы пытаетесь объединить JSR-303 @ Допустимая аннотация с классической пружинной проверкой.Зачем тебе это делать?Эквивалентные аннотации JSR-303 для класса UserValidator будут выглядеть примерно так:

@NotNull
@Size(min=1)
private String userName;

@NotNull
@Size(min=1)
private String password

...

Пружина Документация иллюстрирует шаги, необходимые для настройки проверки JSR-303.Вам понадобится hibernate-validator (или другой поставщик JSR-303), чтобы вышеперечисленное работало.Вам также необходимо настроить bean-компонент validator, как показано ниже.

<bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

Другие ответы на этот вопрос также находятся в той же строке.

11 голосов
/ 03 июня 2011

Вам необходимо определить валидатор для использования в вашем контроллере, используя аннотацию @InitBinder, например:

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(new UserValidator());
}
6 голосов
/ 07 июня 2011

Другой способ - вызвать инициализацию валидатора пружины из вашего контроллера

DataBinder dataBinder = new DataBinder(user);
dataBinder.setValidator(userValidator);
dataBinder.validate();

BindingResult result = dataBinder.getBindingResult();

if(result.hasErrors() == false) {
   // error exists
} 
1 голос
/ 18 июля 2014

Вам нужно поместить @Component в реализацию Validator, чтобы контейнер Spring мог распознать его как:

@Component
public class UserValidator implements Validator {

и использовать следующий метод в контроллере:

@ InitBinder(UserVO) защищенный void initBinder (WebDataBinder binder) {binder.setValidator (userValidator);}

0 голосов
/ 02 января 2014

Если вы используете проверку в стиле JSR-303 с Spring (т. Е. Глобальный экземпляр Validator, предоставляемый реализацией JSR-303, такой как Hibernate Validator), и , у вас есть @InitBinder -аннотированный метод в вашем Controller вы должны ввести Validator в свой контроллер и установить его в методе @InitBinder:

@Autowired
public void setValidator(Validator validator) {
    this.validator = validator;
}

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(this.validator);
}

Для валидатора WebDataBinder по умолчанию установлено значение null, а не (как и следовало ожидать) для глобального экземпляра JSR-303 Validator, поэтому ваши модели не будут проверены Spring , если вы установите здесь экземпляр Validator вручную.

Это только если у вас есть метод @InitBinder. Если нет, все работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...