【问题标题】:Spring JSR303 validation doesn't work like described in Spring DocumentationSpring JSR303 验证不像 Spring Documentation 中描述的那样工作
【发布时间】:2009-10-02 11:22:45
【问题描述】:

我尝试按照 Spring 3.0 文档的 5.7.4.3 部分所述为我的 Web 应用程序实施验证:

<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 添加为依赖项,一切看起来都不错,但启动我的网络应用程序会导致以下错误:

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.Validator 而 ConfigurableWebBindingInitializer.setValidator() 期望 org.springframework.validation.Validator。

有什么解决办法吗?

编辑

关于LocalValidatorFactoryBean:

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

就像亚历克斯马歇尔在下面所说的那样,不是。 LocalValidatorFactoryBean 只实现了javax.validation.Validator。

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

【问题讨论】:

标签: validation spring hibernate-validator bean-validation


【解决方案1】:

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

使用上面我的问题中的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。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 所以我的第一个怀疑是正确的。感谢您确认。我会尝试提交错误。
    • 鉴于 Spring 3 仍处于测试阶段,称之为严重疏忽是不公平的。
    猜你喜欢
    • 2018-05-31
    • 2011-01-11
    • 2020-04-04
    • 2017-10-31
    • 1970-01-01
    • 2022-12-12
    • 2017-09-25
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多