我尝试为我的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.Validator
,ConfigurableWebBindingInitializer.setValidator()
期望org.springframework.validation.Validator
。
对此有何解决方案?
修改
这是Spring应用程序上下文中
javax.validation
(JSR-303)设置的中心类:它引导javax.validation.ValidationFactory
并通过SpringValidator
接口以及通过JSR-303Validator
接口和ValidatorFactory
接口本身。
就像亚历克斯·马歇尔(Alex Marshall)所述,这是不的情况。 LocalValidatorFactoryBean
仅实施javax.validation.Validator
。
LocalValidatorFactoryBean
确实扩展了SpringValidatorAdapter
,实现了org.springframework.validation.Validator
。
答案 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问题跟踪器中为此创建一个问题