6

我尝试为我的 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.ValidatorwhileConfigurableWebBindingInitializer.setValidator()期望一个org.springframework.validation.Validator.

有什么解决办法吗?

编辑

关于LocalValidatorFactoryBean

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

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

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

4

2 回答 2

6

这是此问题的解决方法:

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

@Autowired
private javax.validation.Validator validator;

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

它很脏,但它可以工作,因为LocalValidatorFactoryBeanextendsSpringValidatorAdapter并且 this 实现了org.springframework.validation.Validator.

于 2009-10-06T11:09:45.590 回答
4

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

于 2009-10-02T18:42:58.080 回答