2016-04-19 3 views
0

не Предположим, что RequestScope активен (с помощью @InRequestScope КДИ-устройства)Ожидается? CDI Запрос контекстными боб впрыскивается в производителя впрыскивают в зависимости боб дает WELD-001303: Нет активных контекстов

Учитывая

package at.joma.stackoverflow.cdi; 

public class Product { 

    public Product(String withValue){ 
     this.value = withValue; 
    } 

    public String value; 

} 
  • инъекции продукта в этой активной области действия запроса
package at.joma.stackoverflow.cdi; 
import javax.inject.Inject; 

import org.jglue.cdiunit.AdditionalClasses; 
import org.jglue.cdiunit.CdiRunner; 
import org.jglue.cdiunit.InRequestScope; 
import org.junit.Assert; 
import org.junit.Test; 
import org.junit.runner.RunWith; 

@RunWith(CdiRunner.class) 
@AdditionalClasses({ Producer.class, SomeCache.class }) 
public class ExpectedTest { 

    @Inject 
    Product productA; 

    @Inject 
    Product productB; 

    @Test 
    @InRequestScope 
    public void testScoping() { 
     Assert.assertNotNull(productA); 
     System.out.println(productA.value); 
     Assert.assertNotNull(productB); 
    } 

} 
  • с использованием зависимого Производитель (с InjectionPoint параметром, поэтому должны быть зависимыми)
package at.joma.stackoverflow.cdi; 

import javax.enterprise.inject.Produces; 
import javax.enterprise.inject.spi.InjectionPoint; 
import javax.inject.Inject; 

public class Producer { 

    public static final String VALUE_B = "valueB"; 

    public static final String VALUE_A = "valueA"; 

    @Inject 
    SomeCache someCache; 

    @Produces 
    public Product produceProduct(InjectionPoint ip) { 
     if (!VALUE_B.equals(someCache.getCacheValue())) { 
      someCache.setCacheValue(VALUE_A); 
     } else { 
      someCache.setCacheValue(VALUE_B); 
     } 
     return new Product(someCache.getCacheValue()); 
    } 

} 
  • и что производитель должен быть введен запрос областью действия фасоли
package at.joma.stackoverflow.cdi; 

import javax.enterprise.context.RequestScoped; 

@RequestScoped 
public class SomeCache { 

    private String cacheValue; 

    public String getCacheValue() { 
     return cacheValue; 
    } 

    public void setCacheValue(String cacheValue) { 
     this.cacheValue = cacheValue; 
    } 

} 

Когда это не удается причину бланка с запросами на предоставление услуг с

org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped 
    at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:708) 
    at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:90) 
    at org.jboss.weld.bean.ContextualInstanceStrategy$CachingContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:165) 
    at org.jboss.weld.bean.ContextualInstance.getIfExists(ContextualInstance.java:63) 
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:83) 
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance(ProxyMethodHandler.java:125) 
    at at.joma.stackoverflow.cdi.SomeCache$Proxy$_$$_WeldClientProxy.getCacheValue(Unknown Source) 
    at at.joma.stackoverflow.cdi.Producer.produceProduct(Producer.java:18) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:88) 
    at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:78) 
    at org.jboss.weld.injection.producer.ProducerMethodProducer.produce(ProducerMethodProducer.java:95) 
    at org.jboss.weld.injection.producer.AbstractMemberProducer.produce(AbstractMemberProducer.java:167) 
    at org.jboss.weld.bean.AbstractProducerBean.create(AbstractProducerBean.java:183) 
    at org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69) 
    at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:101) 
    at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50) 
    at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:761) 
    at org.jboss.weld.manager.BeanManagerImpl.getInjectableReference(BeanManagerImpl.java:861) 
    at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92) 
    at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:375) 
    at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:386) 
    at org.jboss.weld.injection.producer.ResourceInjector$1.proceed(ResourceInjector.java:70) 
    at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48) 
    at org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:72) 
    at org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:121) 
    at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:159) 
    at org.jboss.weld.context.AbstractContext.get(AbstractContext.java:96) 
    at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:101) 
    at org.jboss.weld.bean.ContextualInstanceStrategy$ApplicationScopedContextualInstanceStrategy.get(ContextualInstanceStrategy.java:141) 
    at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50) 
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:99) 
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance(ProxyMethodHandler.java:125) 
    at at.joma.stackoverflow.cdi.ExpectedTest$Proxy$_$$_WeldClientProxy.testScoping(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.jglue.cdiunit.CdiRunner$2.evaluate(CdiRunner.java:179) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
  • Является ли это ожидаемым поведением CDI?
  • Если да, то из-за зависимого псевдопроизведения Продюсера?
  • Почему это не сбой, если SomeCache - это область приложения, а не область запроса?

Что такое разумное решение для SomeCache?

Этот (нерабочий) запрос с областью действия SomeCache кэширует некоторые данные, которые производитель должен произвести для первого готового компонента. Таким образом, он может

  • ни зависит (как это делает кэширование бесполезно)
  • это не должно быть приложение области действия или статическим (слишком широкий сфера)

В идеале это должно автомагический быть в том же самом объем компонента, в который вводится Продукт, - в примере, который является ExpectedTest. Может быть, еще одна пользовательская область cdi, но не должна зависеть от разработчика клиента/пользователя, определяющего эту область. Можно назвать это «транзитивным зависящим от области видимости», если это имеет смысл.

+0

Вопрос очень сложный, извините. Можете ли вы поделиться своим кодом и полным стеклом? –

+0

Привет @JohnAment, спасибо за комментирование. Добавлен код, трассировка и выравнивание текста с помощью классов. –

ответ

0

Является ли это ожидаемым поведением CDI? -> No

Причина отказа состояла в том, что cdi-unit не регистрирует/не сообщает, что он не может настроить область запроса. И поэтому я пропустил определение следующей зависимости. Кстати, это определено как указано в cdi-unit. Так что это все о облавах :)

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>javax.servlet-api</artifactId> 
    <version>3.0.1</version> 
    <scope>provided</scope> 
</dependency> 
Смежные вопросы