RESTEasy,CDI,嵌入式Jetty,bean验证被忽略

时间:2014-02-11 06:21:58

标签: groovy cdi resteasy bean-validation embedded-jetty

我有一个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

我在阳光下尝试过一切都没有成功。请帮助。

2 个答案:

答案 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没有。当我将它从方法移动到参数时,它开始工作。 现在,我遇到了我认为是一个焊接错误,但我会分别发布这个问题。