2009-10-02 98 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