средство проверки гибернации без использования autowire - PullRequest
1 голос
/ 15 сентября 2011

В настоящее время я работаю над проектом в Джерси и решил использовать валидатор Hibernate для валидации параметров.Все зависимости, введенные в классы Endpoint, правильно инициализированы.Однако для этих зависимостей в классах ConstraintValidator он всегда выбрасывает NPE.Поэтому я следовал руководству по Spring + hibernate и зарегистрировал

идентификатор компонента = "validator" class = "org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"

ииспользовал аннотацию @Autowired для сервисов в классе ConstraintValidator, который необходимо внедрить.

есть ли побочные эффекты от его использования?Есть ли способ избежать аннотации автопроводки в классе ConstraintValidator и все еще вводить значения?Я попытался вручную зарегистрировать класс constraintValidator в контексте как bean-компонент, добавив ссылку на свойство в нужную мне службу, однако он выдает исключение нулевого указателя.

1 Ответ

2 голосов
/ 01 октября 2011

«Средство проверки гибернации - Справочная реализация JSR 303 - Справочное руководство» говорит о портальности:

Предупреждение

Любая реализация ограничений, основанная на поведении ConstraintValidatorFactory, специфичномк реализации (внедрение зависимостей, отсутствие конструктора без аргументов и т. д.) не считаются переносимыми.

Итак, это плохо?По моему это не так.Конечно, теперь вы подключены к контейнеру DI (Spring) и не можете легко использовать валидаторы (например, если не используете Spring).С другой стороны, с вашими валидаторами, собранными на фабрике Spring, вы можете в полной мере использовать преимущества инфраструктуры и выполнять очень тяжелую работу (читать данные ревизий для сущностей и сравнивать предыдущие состояния, вызывать произвольные сервисы, расширять или локализовать сообщения валидации)..).

Одна вещь, с которой вы должны быть очень осторожны, это то, что семантика валидатора обычно только для чтения и не должна вызывать побочные эффекты при ее вызове.Например, не следует случайно сбрасывать данные в базу данных из-за некоторой автоматической очистки путем вызова (транзакционной) службы или чтения данных внутри вашего валидатора.

...