Внедрение зависимостей в JSR-303 ConstraintValidator

У меня та же проблема, что и у парня из этот нить имеет. Точнее, я получаю следующую ошибку при попытке внедрить bean-компонент в мой пользовательский валидатор, который реализует интерфейс CustomValidator (это NPE при доступе к bean-компоненту, который я хотел внедрить):

javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.
at org.hibernate.validator.internal.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:294)
at org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:164)
at org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:125)
at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:86)

...

Вызвано: java.lang.NullPointerException

У вас есть решение для этого? Может пример? Потому что я попробовал решения, предложенные в другом потоке, и ничего не получилось.

Любая помощь приветствуется. Спасибо.


person TheRock3t    schedule 13.06.2013    source источник
comment
Опубликуйте пример своего валидатора вместе с трассировкой стека Caused by. Исключения верхнего уровня обычно не так интересны. Также включите конфигурацию вашего валидатора (XML или @Configuration bean)   -  person Pavel Horal    schedule 13.06.2013
comment
Это было вызвано NPE при доступе к данным из bean-компонента, который я хотел внедрить в валидатор. Я использую валидатор по умолчанию, поэтому у меня нет конкретной конфигурации XML. Вот как я вызываю валидатор ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Валидатор validator = factory.getValidator(); Set‹ConstraintViolation‹Class›› ограниченияViolations = validator.validate(object);   -  person TheRock3t    schedule 13.06.2013
comment
Вероятно, вам не следует использовать Validation. Просто @Autowire ValidatorFactory если вы хотите создать свой валидатор вручную. Я включу это в реальный ответ :).   -  person Pavel Horal    schedule 13.06.2013


Ответы (1)


Вам не следует создавать фабрику валидаторов самостоятельно (Validation.buildDefaultValidatorFactory()), если вы хотите использовать валидаторы ограничений на основе Spring.

Вы должны позволить Spring автоматически связать фабрику с вашим bean-компонентом:

@Controller
public class MyController {

    @Autowired
    private ValidatorFactory validatorFactory;

    // ... handler methods

}
person Pavel Horal    schedule 13.06.2013
comment
В порядке. Я объявил bean-компонент LocalValidatorFactoryBean в файле xml. Я подключаю его, как вы предлагаете, но я все еще получаю NPE при вызове метода getValidator() для связанного компонента Validator validator = validatorFactory.getValidator(); (вот NPE) Set‹ConstraintViolation‹Class›› ConstraintViolations = validator.validate(object); - person TheRock3t; 13.06.2013
comment
Павел Хорал, есть предложения? - person TheRock3t; 13.06.2013
comment
Хм... судя по исходникам невозможно получить null из LocalValidatorFactoryBean#getValidator при использовании hibernate-validator. Можешь поделиться своей конфигурацией? - person Pavel Horal; 13.06.2013
comment
Ага. Есть ноль. Я использую maven в качестве менеджера сборки, и в моем pom у меня есть эти зависимости, объявленные ‹dependency› ‹groupId›javax.validation‹/groupId› ‹artifactId›validation-api‹/artifactId› ‹version›1.0.0.GA‹/version › ‹/dependency› ‹dependency› ‹groupId›org.hibernate‹/groupId› ‹artifactId›hibernate-validator‹/artifactId› ‹version›4.3.0.Final‹/version› ‹scope›runtime‹/scope› ‹/ зависимость› - person TheRock3t; 14.06.2013
comment
Попробуйте отладить вызов getValidator. Spring должен почти сразу вызвать ValidatorFactoryImpl#getValidator Hibernate, который затем должен вызвать ValidatorContextImpl#getValidator, который всегда возвращает ValidatorImpl. Вы не можете получить null, если только нет какой-то путаницы с зависимостями, о которой вы не знаете, или у вас агрессивная конфигурация AOP, или я не знаю :). - person Pavel Horal; 14.06.2013
comment
Когда я загружаю контекст своего приложения, я получаю следующую ошибку: org.springframework.beans.factory.NoSuchBeanDefinitionException: для зависимости не найден соответствующий bean-компонент типа [javax.validation.ValidatorFactory]: ожидается по крайней мере 1 bean-компонент, который квалифицируется как кандидат autowire для этого зависимость. Аннотации зависимостей: {@javax.annotation.Resource(shareable=true, mappedName=, description=, name=, type=class java.lang.Object, authenticationType=CONTAINER, lookup=)}. Но я объявил LocalValidatorFactoryBean. И я пытаюсь внедрить его в экземпляр ValidationFactory, как вы предложили. - person TheRock3t; 14.06.2013
comment
Не могли бы вы поделиться конфигурацией Spring (XML или @Configuration). Где ваш bean-валидатор, куда вы пытаетесь его внедрить,... - person Pavel Horal; 14.06.2013