【问题标题】:Maven: javax.enterprise.context.ContextNotActiveException while running tests with openejbMaven:使用 openejb 运行测试时出现 javax.enterprise.context.ContextNotActiveException
【发布时间】:2015-07-31 12:59:32
【问题描述】:

在 OpenEjb 和带有嵌入式容器的 Junit 的帮助下,我为我的 Java-ee 项目创建了一些单元测试和集成测试。测试在 Eclipse 中运行良好,bean(CDI/EJB)被注入并且工作正常。但是当我用 maven 和 surefire 开始测试时,我得到了以下错误:

WARNING: Handling the following exception
Throwable occurred: javax.enterprise.context.ContextNotActiveException: WebBeans context with scope type annotation @RequestScoped does not exist within current thread
at org.apache.webbeans.container.BeanManagerImpl.getContext(BeanManagerImpl.java:330)
at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.getContextualInstance(NormalScopedBeanInterceptorHandler.java:88)
at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.get(NormalScopedBeanInterceptorHandler.java:70)
at org.apache.webbeans.conversation.ConversationImpl$$OwbNormalScopeProxy0.isTransient(org/apache/webbeans/conversation/ConversationImpl.java)
at org.apache.wicket.cdi.ConversationPropagator.onUrlMapped(ConversationPropagator.java:322)
at org.apache.wicket.request.cycle.RequestCycleListenerCollection$9.notify(RequestCycleListenerCollection.java:208)

可能出了什么问题?看起来像是类路径问题或其他问题,但显式添加 openwebbeans-spi 和 openwebbeans-impl 不起作用。

我在测试类中使用以下几行:

@ClassRule
public static final EJBContainerRule CONTAINER_RULE = new EJBContainerRule();

@Rule
public final InjectRule rule = new InjectRule(this, CONTAINER_RULE);

我有以下 openejb-junit.properties:

openejb.validation.output.level=VERBOSE
openejb.deployments.classpath.include=.*org.mine.*
openejb.descriptors.output=true
openejb.ejbcontainer.close=single-jvm
java.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory

感谢您的帮助。

您好, 胡尔斯。

【问题讨论】:

    标签: jakarta-ee junit cdi openejb openwebbeans


    【解决方案1】:

    我不确切知道您是如何创建/解析 bean 的,但这听起来与我们在测试设置中遇到的类似问题。当您使用 bean 管理器手动解析 bean 时,它与创建上下文无关,您必须手动执行此操作。

    我曾经在我们的测试代码中编写了一个使用 CDI 检索 bean 的小实用方法:

    public <T> T getCDIBean(Class<T> type, AnnotationLiteral<?>... qualifierAnnotations) {
        Set<Bean<?>> beans = getBeanManager().getBeans(type, qualifierAnnotations);
    
        Bean<?> bean;
        if (beans.size() == 1) {
            bean = beans.iterator().next();
        } else {
            bean = getBeanManager().resolve(beans);
        }
    
        CreationalContext<?> context = getBeanManager().createCreationalContext(bean);
        return (T) getBeanManager().getReference(bean, type, context);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 2012-02-05
      相关资源
      最近更新 更多