Spring 3验证不起作用

时间:2011-06-03 13:15:26

标签: java validation spring-mvc

我的应用程序中有一个用户实体,我需要验证。

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验证器。我们在应用程序中没有使用hibernate。 请帮忙。

EDIT2: -

当我在我的实体类中直接使用验证注释(@NotNull,@ Size等)时,控制器中的@Valid注释可以工作但是如果我从我的实体中删除它们并尝试使用上面写的验证器那么@Valid不起作用。

是否只有@Valid注释仅适用于实体中的验证注释而不适用于验证器?为了使用我的验证器,我必须直接在验证器中调用validate方法吗?

5 个答案:

答案 0 :(得分:14)

据我所知,您正在尝试将JSR-303 @Valid注释与经典弹簧验证相结合。你为什么想做这个? UserValidator类的等效JSR-303注释如下所示:

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

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

...

spring documentation说明了配置JSR-303验证所需的步骤。您需要hibernate-validator(或其他JSR-303提供商)才能使用上述工作。您还需要配置validator bean,如下所示。

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

这个问题的其他答案也在同一行。

答案 1 :(得分:11)

您需要使用@InitBinder注释定义要在控制器中使用的验证器,例如:

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(new UserValidator());
}

答案 2 :(得分:6)

其他方法是从控制器调用spring validator初始化

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

BindingResult result = dataBinder.getBindingResult();

if(result.hasErrors() == false) {
   // error exists
} 

答案 3 :(得分:1)

您需要将@Component放在Validator实现上,以便Spring容器可以将其识别为:

@Component
public class UserValidator implements Validator {

并在控制器中使用以下方法:

@InitBinder(UserVO)     protected void initBinder(WebDataBinder binder){binder.setValidator(userValidator);     }

答案 4 :(得分:0)

如果对Spring使用JSR-303样式验证(即JSR-303实现提供的全局Validator实例,例如Hibernate Validator),则有@InitBinderController中注明的方法,您必须Validator注入您的控制器将其设置为@InitBinder方法:< / p>

@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不会验证您的模型< strong>除非您在此处手动设置Validator实例。

仅当您使用@InitBinder方法时才会这样。如果不这样做,一切都按预期工作。