2014-02-11 4 views
0

Я заводной проект, в котором я использую Resteasy с Weld и приступить к реализации встроенного Jetty. Кажется, что я не могу работать, это проверка валиков. Resteasy документация говорит, что добавление resteasy-validator-provider-11 вместе с зависимостями спящего режима валидатора (hibernate-validator, hibernate-validator-cdi, javax.el-api, javax.el) достаточно. Но проверка подлинности боба просто игнорируется RESTEasy. Я любопытно также получить следующее сообщение в логах:Resteasy, CDI, встроенный Jetty, проверка боб игнорируется

plugins.validation.ValidatorContextResolver - Unable to find CDI supporting ValidatorFactory. Using default ValidatorFactory 

На основе предложений по [этому] [1] пост, я попробовал регистрации Hibernate InjectingConstraintValidatorFactory в META-INF/validation.xml, но это зависит от BeanManager впрыскивается и взрывается во время работы.

Код можно найти здесь https://github.com/abhijitsarkar/groovy/tree/master/movie-manager/movie-manager-web

Бревно Суть здесь: https://gist.github.com/anonymous/8947319

Я пробовал все под солнцем без какого-либо успеха. Помощь Pls.

+0

Трудно сказать, что проблема здесь, не зная деталей. В общем, я думаю, что вам лучше использовать контейнер EE, такой как WildFly, который интегрирует все эти технологии для вас из коробки, так что вам не придется проходить через эту проблему самостоятельно. – Gunnar

+0

@Gunnar я избегаю контейнер EE, потому что я хочу, чтобы создать исполняемый войну с встроенным контейнером и Jetty отвечает этим требованиям. Я добавил дополнительные сведения к своему сообщению. Помощь Pls. Я пробовал все под солнцем без каких-либо успехов. –

ответ

1

я, наконец, это исправил. Оказывается, файл validation.xml на самом деле не требуется, модуль resteasy-cdi отлично справляется с регистрацией BeanManager. То, что мне не хватало и не было четко документировано в любом месте, заключается в том, что если аннотация помещается на метод, механизм проверки просто «решает», что должно быть проверено. Я поместил @NotNull на метод, и он проверял тип возвращаемого значения, а не параметры. Можно использовать validationAppliesTo элемент в некоторых случаях, но @NotNull не имеет его. Когда я переместил его из метода в параметр, он начал работать. Теперь я столкнулся с тем, что, по моему мнению, является ошибкой Weld, но я опубликую этот вопрос отдельно.

1

Чтобы сделать это без EE, я считаю, что вам нужно разблокировать существующий InjectingConstraintValidatorFactory, но вместо того, чтобы использовать инъекцию менеджера компонентов, используйте класс CDI 1.1 CDI, чтобы получить ссылку на менеджер компонента, например. CDI.current().getBeanManager(). http://docs.jboss.org/cdi/api/1.1/javax/enterprise/inject/spi/CDI.html

Для этого вам нужно быть на CDI 1.1 (так что я считаю, что сварка 2+, 2.1.1 актуальна). Вот пример осущ, на основе: https://github.com/hibernate/hibernate-validator/blob/master/cdi/src/main/java/org/hibernate/validator/internal/cdi/InjectingConstraintValidatorFactory.java

public class InjectingConstraintValidatorFactory implements ConstraintValidatorFactory { 
     // TODO look for something with better performance (HF) 
     private final Map<Object, DestructibleBeanInstance<?>> constraintValidatorMap = 
       Collections.synchronizedMap(new IdentityHashMap<Object, DestructibleBeanInstance<?>>()); 

     private final BeanManager beanManager; 

     public InjectingConstraintValidatorFactory() { 
      this.beanManager = CDI.current().getBeanManager(); 
      Contracts.assertNotNull(this.beanManager, "The BeanManager cannot be null"); 
     } 

     @Override 
     public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) { 
      DestructibleBeanInstance<T> destructibleBeanInstance = new DestructibleBeanInstance<T>(beanManager, key); 
      constraintValidatorMap.put(destructibleBeanInstance.getInstance(), destructibleBeanInstance); 
      return destructibleBeanInstance.getInstance(); 
     } 

     @Override 
     public void releaseInstance(ConstraintValidator<?, ?> instance) { 
      DestructibleBeanInstance<?> destructibleBeanInstance = constraintValidatorMap.remove(instance); 
      destructibleBeanInstance.destroy(); 
     } 
    } 
+0

Сделал это, не сработал. BeanManager по-прежнему имеет значение null. Использование сварного шва 2.1.2. '@Inject \t общественного InjectingConstraintValidatorFactory (BeanManager beanManager) { \t, если (beanManager == NULL) { \t this.beanManager = CDI.current() getBeanManager(). \t} \t else { \t this.beanManager = beanManager; \t} \t \t \t Contracts.assertNotNull (this.beanManager, "О BeanManager не может быть пустым"); \t \t \t} ' –

+0

Не используйте конструктор' @ Inject', используйте конструктор no arg. –

+0

см. Мой ответ выше. –

Смежные вопросы