Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy RESTEasy、CDI、嵌入式Jetty、bean验证被忽略_Groovy_Cdi_Resteasy_Bean Validation_Embedded Jetty - Fatal编程技术网

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

Groovy RESTEasy、CDI、嵌入式Jetty、bean验证被忽略,groovy,cdi,resteasy,bean-validation,embedded-jetty,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.validati

我有一个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
根据[1]这篇文章的建议,我尝试在META-INF/validation.xml中注册Hibernate
InjectingConstraintValidatorFactory
,但这取决于正在注入的BeanManager,并在运行时崩溃

代码可以在这里找到

日志摘要如下:


我什么都试过了,但没有成功。请提供帮助。

要在没有EE的情况下执行此操作,我相信您需要使用现有的
InjectingConstraintValidatorFactory
,但不要使用bean管理器的注入,而是使用CDI 1.1类
CDI
来获取bean管理器的引用,例如
CDI.current().getBeanManager()

要做到这一点,您确实需要使用CDI 1.1(因此我认为Weld 2+,2.1.1是最新版本)。以下是一个示例impl,基于:

公共类InjectingConstraintValidatorFactory实现ConstraintValidatorFactory{
//TODO寻找性能更好的产品(HF)
私有最终映射>T getInstance(类密钥){
DestructibleBeanInstance DestructibleBeanInstance=新的DestructibleBeanInstance(beanManager,键);
constraintValidatorMap.put(destructibleBeanInstance.getInstance(),destructibleBeanInstance);
返回destructibleBeanInstance.getInstance();
}
@凌驾
public void releaseInstance(ConstraintValidator实例){
DestructibleBeanInstance DestructibleBeanInstance=constraintValidatorMap.remove(实例);
destructibleBeanInstance.destroy();
}
}

我终于解决了这个问题。事实证明,validation.xml并不是必需的,
resteasycdi
模块在注册BeanManager方面做得很好。我缺少的是,如果在方法上放置注释,验证引擎只是“决定”应该验证的内容,而没有在任何地方清楚地记录。我在一个方法上放置了一个
@NotNull
,它正在验证返回类型,而不是参数。在某些情况下,可以使用
validationapplicatesto
元素,但
@NotNull
没有它。当我将它从方法移动到参数时,它开始工作。
现在我遇到了一个我认为是焊接缺陷的问题,但我将单独发布该问题。

如果不知道细节,很难说出问题所在。一般来说,我认为你最好使用一个EE容器,比如WildFly,它为你集成了所有这些现成的技术,所以你不必自己解决这个问题。@Gunnar我在避免使用EE容器,因为我想用嵌入式容器创建一场可执行的战争,Jetty符合要求。我在帖子中添加了更多细节。请帮忙。我什么都试过了,但没有成功。那样做了,没用。BeanManager仍然为空。使用焊缝2.1.2.1最终<代码>@InjectPublic InjectingConstraintValidatorFactory(BeanManager BeanManager){if(BeanManager==null){this.BeanManager=CDI.current().getBeanManager();}其他{this.BeanManager=BeanManager;}Contracts.assertNotNull(this.BeanManager,“BeanManager不能为null”);}不要使用
@Inject
构造函数,请使用无参数构造函数。请参阅我上面的答案。
    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();
        }
    }