Spring JSR303验证不像Spring文档中描述的那样工作

时间:2009-10-02 11:22:45

标签: validation spring hibernate-validator bean-validation

我尝试为我的Web应用程序实现验证,如Spring 3.0文档的5.7.4.3部分所述:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="validator">
                <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
            </property>
        </bean>
    </property>
</bean>

我添加了hibernate-validator作为依赖项,一切看起来都不错,但启动我的Web应用程序会导致以下错误:

org.springframework.beans.NotWritablePropertyException:
Invalid property 'validator' of bean class
[org.springframework.web.bind.support.ConfigurableWebBindingInitializer]:
Bean property 'validator' is not writable or has an invalid setter method.
Does the parameter type of the setter match the return type of the getter?

在查看API时,很明显出现了问题。 LocalValidatorFactoryBean实施javax.validation.ValidatorConfigurableWebBindingInitializer.setValidator()期望org.springframework.validation.Validator

对此有何解决方案?

修改

关于LocalValidatorFactoryBean

  

这是Spring应用程序上下文中javax.validation(JSR-303)设置的中心类:它引导javax.validation.ValidationFactory并通过Spring Validator接口以及通过JSR-303 Validator接口和ValidatorFactory接口本身。

就像亚历克斯·马歇尔(Alex Marshall)所述,这是的情况。 LocalValidatorFactoryBean仅实施javax.validation.Validator

LocalValidatorFactoryBean确实扩展了SpringValidatorAdapter,实现了org.springframework.validation.Validator

2 个答案:

答案 0 :(得分:6)

以下是此问题的解决方法:

使用上述问题中的validator bean配置,您必须使用验证在每个控制器中添加以下代码。

@Autowired
private javax.validation.Validator validator;

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

它很脏,但它有效,因为LocalValidatorFactoryBean扩展了SpringValidatorAdapter,这实现了org.springframework.validation.Validator

答案 1 :(得分:4)

如果查看Javadocs for ConfigurableWebBindingInitializer,其属性'validator'的类型为'org.springframework.validation.Validator'。如果你那么看看 Javadocs for LocalValidatorFactoryBean,你会发现它实际上既没有实现FactoryBean(也没有创建org.springframework.validation.Validator),也没有实现org.springframework.validation.Validator本身,所以你给的是bean' ConfigurableWebBindingInitializer的validator属性是错误的类型,如错误所示。我怀疑这是Spring开发人员的一个(严重?)疏忽,你应该在jira.springframework.org的JIRA问题跟踪器中为此创建一个问题