2009-10-02 4 views
6

Я попытался реализации проверки для моего веб-приложения, как описано в разделе 5.7.4.3 документации Spring 3.0:Spring JSR303 не работает, как описано в документации Spring

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

я добавил гибернации-валидатор как зависимость и все выглядит нормально, но, начиная мои результаты веб-приложения в следующей ошибки:

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.

Любое решение для этого?

EDIT

О 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 Spring не совместим с этой версией. – Koraktor

+1

Открыт вопрос JIRA по адресу http://jira.springframework.org/browse/SPR-6189. – Koraktor

ответ

6

Вот решения этой проблемы:

Используя конфигурацию bean-конфигурации validator из моего вопроса выше, вы должны добавить следующий код в каждый контроллер, используя проверку.

@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, его свойство 'validator' имеет тип 'org.springframework.validation.Validator'. Если вы затем посмотрите на Javadocs for LocalValidatorFactoryBean, вы увидите, что на самом деле он не реализует ни FactoryBean (для создания org.springframework.validation.Validator), либо не реализует сам org.springframework.validation.Validator, поэтому компонент давая свойство «validator» ConfigurableWebBindingInitializer неправильного типа, как указано ошибкой. Я подозреваю, что это (брутто?) Контроль со стороны разработчиков Spring, и вы должны создать проблему для этого в их JIRA отслеживания проблем в jira.springframework.org

+0

Итак, мое первое подозрение было правильным. Спасибо, что подтвердили это. Я попробую подать ошибку. – Koraktor

+1

Несправедливо назвать это грубым оплотом, учитывая, что Spring 3 все еще находится в тестировании. – skaffman