2014-10-29 28 views
12

使用Weld-SE 2.1.2.Final獲取bean並從線程調用它時,遇到以下異常:從線程調用bean時,沒有活動上下文類型爲javax.enterprise.context.RequestScoped

異常線程 「main」 org.jboss.weld.context.ContextNotActiveException:WELD-001303:對於範圍類型沒有有效上下文javax.enterprise.context.RequestScoped

我的豆被標註與@RequestScooped。如果我註釋@ApplicationScoped,那麼它工作正常,但我需要保持@RequestScooped。

這裏是一個再現:

public static void main(String[] args) throws Exception { 
    Weld weld = new Weld(); 
    WeldContainer container = weld.initialize(); 
    final MyPojo pojo = container.instance().select(MyPojo.class).get(); 

    Thread t = new Thread() { 
     public void run() { 
      System.out.println(pojo.ping()); // This call fails 
     } 
    }; 
    t.start(); 
    t.join(); 
    System.out.println(pojo.ping()); // This call succeed 
    weld.shutdown(); 

} 

@RequestScoped 
public class MyPojo { 
public String ping() { 
    return "pong"; 
} 
} 

你遇到這樣的行爲呢?任何想法,使這項工作嗎?

回答

19

在這種情況下,Weld正在使用與線程關聯的未綁定RequestContext(RequestContext)。你需要在你創建一個線程來手動初始化新的RequestContext,這個工作對我來說:

public static void main(String[] args) throws Exception { 
    Weld weld = new Weld(); 
    final WeldContainer container = weld.initialize(); 
    RequestContext requestContext= container.instance().select(RequestContext.class, UnboundLiteral.INSTANCE).get(); 
     requestContext.activate(); 

    final MyPojo pojo = container.instance().select(MyPojo.class).get(); 

    Thread t = new Thread() { 
     public void run() { 
      RequestContext requestContext= container.instance().select(RequestContext.class, UnboundLiteral.INSTANCE).get(); 
      requestContext.activate(); 
      System.out.println("1" + pojo.ping()); 
     } 
    }; 
    t.start(); 
    t.join(); 
    System.out.println("2" + pojo.ping()); 
    weld.shutdown(); 

} 
+0

除非我在創建線程之前重複請求上下文創建和激活它沒有爲我工作。我相信在你以前的答案中就是這種情況。 – Nader 2014-10-30 06:40:55

+0

是的你是對的,我把它放回去。 – kaos 2014-10-30 10:33:18

+0

太棒了!非常感謝您的幫助 ! – Nader 2014-10-30 11:14:58

相關問題