Я пишу веб-приложение на Java & Spring 2.5.6 и использую аннотации для проверки компонентов. Я могу получить базовую проверку аннотаций , работающую нормально, и Spring даже вызовет пользовательский Validator, объявленный с @Validator для целевого компонента. Но он всегда создает новый объект Validator для этого. Это плохо, потому что новый валидатор не имеет ни одной из внедренных зависимостей, которые ему нужны для запуска, и поэтому он выдает исключение нулевого указателя при валидации. Мне нужна одна из двух вещей, и я не знаю, как это сделать.
- Убедите Spring использовать уже настроенный валидатор.
- Убедите Spring соблюдать аннотации @Autowired при создании нового валидатора.
В валидаторе есть аннотация @Component, например:
@Component
public class AccessCodeBeanValidator implements Validator {
@Autowired
private MessageSource messageSource;
Spring находит валидатор при сканировании компонента, внедряет зависимости автосвязи, но затем игнорирует его и создает новый во время проверки.
Единственное, что я могу сделать в данный момент, - это добавить ссылку на валидатор в контроллер для каждого объекта валидатора и использовать эту ссылку напрямую, вместо того, чтобы полагаться на структуру валидации бина для вызова валидатора для меня. Похоже на это.
// first validate via the annotations on the bean
beanValidator.validate(accessCodeBean, result);
// then validate using the specific validator class
acbValidator.validate(accessCodeBean, result);
if (result.hasErrors()) {
Если кто-нибудь знает, как убедить Spring использовать существующий валидатор вместо создания нового, или как заставить его выполнять автопроводку при создании нового, я бы хотел знать.
Edit:
Вот код, который сообщает Spring, какой валидатор использовать для bean-компонента.
@Validator(AccessCodeBeanValidator.class)
public class AccessCodeBean {
Работает, но ограничено, как описано выше.
Итак, в настоящее время я закомментировал строку @Validator, и вместо этого я автоматически подключаю валидатор к контроллеру следующим образом.
@Resource(name="accessCodeBeanValidator")
public void setAcbValidator(Validator acbValidator) {
this.acbValidator = acbValidator;
}