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

Kor*_*tor 6 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>
Run Code Online (Sandbox Code Playgroud)

我已经添加了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?
Run Code Online (Sandbox Code Playgroud)

在查看API时,很明显出现了问题.LocalValidatorFactoryBean实现javax.validation.Validator,而ConfigurableWebBindingInitializer.setValidator()需要一个org.springframework.validation.Validator.

对此有何解决方案?

编辑

关于LocalValidatorFactoryBean:

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

就像亚历克斯马歇尔在下面所说的那样情况并非如此.LocalValidatorFactoryBean只实现javax.validation.Validator.

LocalValidatorFactoryBean确实延伸SpringValidatorAdapter,实现 org.springframework.validation.Validator.

Kor*_*tor 6

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

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

@Autowired
private javax.validation.Validator validator;

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

它很脏,但它的工作原因是LocalValidatorFactoryBean扩展SpringValidatorAdapter并实现org.springframework.validation.Validator.