Проверка Spring JSR303 не работает, как описано в документации Spring - PullRequest
6 голосов
/ 02 октября 2009

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

<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 в качестве зависимости, и все выглядит хорошо, но запуск моего веб-приложения приводит к следующей ошибке:

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:

Это центральный класс для настройки javax.validation (JSR-303) в контексте приложения Spring: он загружает javax.validation.ValidationFactory и предоставляет его через интерфейс Spring Validator, а также через JSR-303 * 1034. * интерфейс и сам интерфейс ValidatorFactory.

Как сказал Алекс Маршалл ниже, это , а не . LocalValidatorFactoryBean только орудия javax.validation.Validator.

LocalValidatorFactoryBean расширяет SpringValidatorAdapter, что реализует org.springframework.validation.Validator.

Ответы [ 2 ]

6 голосов
/ 06 октября 2009

Вот обходной путь для этой проблемы:

Используя конфигурацию компонента 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 голосов
/ 02 октября 2009

Если вы посмотрите на Javadocs для ConfigurableWebBindingInitializer , его свойство 'validator' имеет тип 'org.springframework.validation.Validator'. Если вы посмотрите на Javadocs для LocalValidatorFactoryBean , вы увидите, что он на самом деле не реализует ни FactoryBean (для создания org.springframework.validation.Validator), ни реализует org.springframework.validation.Validator, так что вы bean Предоставление свойства 'validator' ConfigurableWebBindingInitializer имеет неправильный тип, как указано в ошибке. Я подозреваю, что это (грубый?) Недосмотр со стороны разработчиков Spring, и вы должны создать проблему для этого в их трекере JIRA по адресу jira.springframework.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...