我有一个Groovy项目,我在其中使用RESTEasy和Weld并部署到嵌入式Jetty。我似乎无法工作的是bean验证。 RESTEasy文档说,添加resteasy-validator-provider-11
以及hibernate验证器依赖项(hibernate-validator, hibernate-validator-cdi, javax.el-api, javax.el
)就足够了。但RESTEasy忽略了bean验证。我好奇地也在日志中收到以下消息:
plugins.validation.ValidatorContextResolver - Unable to find CDI supporting ValidatorFactory. Using default ValidatorFactory
根据[this] [1]帖子的建议,我尝试在META-INF / validation.xml中注册Hibernate InjectingConstraintValidatorFactory
,但它依赖于正在注入的BeanManager并在运行时爆炸。
可在此处找到代码https://github.com/abhijitsarkar/groovy/tree/master/movie-manager/movie-manager-web
日志要点在这里:https://gist.github.com/anonymous/8947319
我在阳光下尝试过一切都没有成功。请帮助。
答案 0 :(得分:1)
要在没有EE的情况下执行此操作,我相信您需要派生现有的InjectingConstraintValidatorFactory
,但不使用注入bean管理器,而是使用CDI 1.1类CDI
来获取对它的引用bean经理,例如CDI.current().getBeanManager()
。 http://docs.jboss.org/cdi/api/1.1/javax/enterprise/inject/spi/CDI.html
你需要在CDI 1.1上执行此操作(因此我认为Weld 2 +,2.1.1是最新的)。这是一个示例impl,基于: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();
}
}
答案 1 :(得分:1)
我终于解决了这个问题。事实证明,确实不需要validation.xml,resteasy-cdi
模块可以很好地注册BeanManager。我遗漏的内容并没有明确记录在任何地方,如果在方法上放置注释,验证引擎只是“决定”应该验证什么。我在方法上放置了@NotNull
,它验证了返回类型,而不是参数。在某些情况下可以使用validationAppliesTo
元素,但@NotNull
没有。当我将它从方法移动到参数时,它开始工作。
现在,我遇到了我认为是一个焊接错误,但我会分别发布这个问题。