2009-10-02 12 views
6

Próbowałem realizacji walidacji dla mojej aplikacji internetowych, takich jak opisane w rozdziale 5.7.4.3 dokumentacji Wiosna 3,0:Wiosna JSR303 nie działa jak opisano w Spring Dokumentacji

<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> 

dodałem hibernacji-walidatora jako uzależnienie i wszystko wygląda OK, ale wychodząc moje wyniki Web app w następujący błąd:

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? 

patrząc na API to jest dość oczywiste, że coś jest nie tak. LocalValidatorFactoryBean implementuje javax.validation.Validator, podczas gdy ConfigurableWebBindingInitializer.setValidator() spodziewa się org.springframework.validation.Validator.

Jakieś rozwiązanie tego?

EDIT

O 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.

jak Alex Marshall nizej to nie przypadek. LocalValidatorFactoryBean implementuje tylko javax.validation.Validator.

ma jednak rozszerzenie SpringValidatorAdapter, które implementuje org.springframework.validation.Validator.

+0

Próbowałem również aktualizacji do 'hibernate-core-3.5.0.Beta-1', ale Spring's Hibernate kod nie jest kompatybilny z tą wersją. – Koraktor

+1

Uruchomiono wydanie JIRA na http://jira.springframework.org/browse/SPR-6189. – Koraktor

Odpowiedz

6

Oto obejście tego problemu:

Używając konfiguracji fasoli validator z powyższego pytania, musisz dodać następujący kod w każdym kontrolerze, używając sprawdzania poprawności.

@Autowired 
private javax.validation.Validator validator; 

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

Jest brudny, ale to działa, ponieważ LocalValidatorFactoryBean rozciąga SpringValidatorAdapter i ten realizuje org.springframework.validation.Validator.

4

Jeśli spojrzeć na Javadocs for ConfigurableWebBindingInitializer, jego właściwość "walidator" jest typu "org.springframework.validation.Validator". Jeśli następnie spojrzysz na Javadocs for LocalValidatorFactoryBean, zobaczysz, że faktycznie nie implementuje ani FactoryBean (aby utworzyć org.springframework.validation.Validator), ani nie implementuje samego org.springframework.validation.Validator, więc jesteś dając właściwość "validator" ConfigurableWebBindingInitializer jest niewłaściwy typ, jak wskazuje błąd. Podejrzewam, że jest to przeoczenie (brutto?) Ze strony deweloperów Wiosna i należy stworzyć problem dla tego w ich emisji trackera JIRA w jira.springframework.org

+0

Więc moje pierwsze podejrzenie było prawidłowe. Dzięki za potwierdzenie tego. Spróbuję zgłosić błąd. – Koraktor

+1

Nieuczciwe nazwać to poważnym niedopatrzeniem, zważywszy, że Spring 3 jest jeszcze w fazie testów. – skaffman

Powiązane problemy