2009-10-02 105 views
6

我试图执行验证像在Spring 3.0文档的部分5.7.4.3描述我的web应用程序:春JSR303验证不起作用像春天文档中描述

<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验证作为依赖,一切看起来不错,但开始我在下面的错误的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 implements javax.validation.Validator,而ConfigurableWebBindingInitializer.setValidator()预计org.springframework.validation.Validator

任何解决方案?

编辑

关于LocalValidatorFactoryBean

This is the central class for javax.validation (JSR-303) setup in a Spring application context: It bootstraps a javax.validation.ValidationFactory and exposes it through the Spring Validator interface as well as through the JSR-303 Validator interface and the ValidatorFactory interface itself.

像亚历克斯·马歇尔低于这个规定是不情况。 LocalValidatorFactoryBean只实现javax.validation.Validator

LocalValidatorFactoryBean虽然延伸SpringValidatorAdapter,它实现了org.springframework.validation.Validator

+0

我也尝试更新到'hibernate-core-3.5.0.Beta-1',但Spring的Hibernate代码与此版本不兼容。 – Koraktor 2009-10-02 12:43:19

+1

在http://jira.springframework.org/browse/SPR-6189上打开JIRA问题。 – Koraktor 2009-10-05 06:25:28

回答

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

4

如果你看看Javadocs for ConfigurableWebBindingInitializer,它的属性'验证器'的类型是'org.springframework.validation.Validator'。如果你看看 Javadocs for LocalValidatorFactoryBean,你会发现它实际上并没有实现FactoryBean(创建一个org.springframework.validation.Validator),也没有实现org.springframework.validation.Validator本身,所以你的bean给出ConfigurableWebBindingInitializer的'validator'属性是错误的类型,如错误所示。我怀疑这是在春季开发者的部分(毛?)的监督,你应该在他们的JIRA问题跟踪在jira.springframework.org

+0

所以我的第一个怀疑是正确的。感谢您的确认。我会尝试提交一个错误。 – Koraktor 2009-10-02 21:28:00

+1

由于Spring 3仍在测试中,所以称之为粗略疏忽。 – skaffman 2009-10-05 12:30:12