2013-01-14 43 views
1

我在使用對話作用域bean的JBoss AS 7.1.1上運行基於CDI的應用程序。 我需要從RESTeasy服務調用其中的一個bean。不幸的是,當我調用範圍的bean在REST服務中使用對話作用域Bean

@Inject 
private ConversationBean service; 


@GET 
@Produces("text/html") 
@Path("/book") 
public void bookTicket(Long l) { 

    service.book(l); 
    . . . . 
} 

對話將返回以下錯誤:

產生的原因:org.jboss.weld.context.ContextNotActiveException:WELD-001303的範圍類型的javax沒有有效的上下文。 enterprise.context.ConversationScoped

是否有解決此問題的方法?
謝謝!

回答

4

我知道我以前回答過這個問題(或者它可能是@SessionScoped,同樣的事情)。會話與CDI中的會話相關聯。由於JAX-RS中沒有會話,因此沒有會​​話。在規範部分6.7.4中,它聲明Conversation範圍僅在JSF請求期間處於活動狀態。

如果您希望創建自己的範圍和上下文,並像對話那樣工作,並將其提供給JAX-RS請求,那當然是可行的,但是您必須有一些位置來存儲範圍,將其與請求相關聯。

+0

你能解釋爲什麼'javax.enterprise.context.SessionScoped'確實在RESTeasy中有效嗎?或者這是由於我將RESTeasy與從同一JBoss(7.1.1-Final)服務的AngularJS網頁結合使用的事實? – gkephorus

+0

我敢打賭,如果你看了一些東西,它會在每次訪問時創建一個新的會話範圍的bean代理,或者實際上你看到狀態在請求之間被正確保留了嗎? – LightGuard

+1

是的,一個cookie發送給客戶端,當這個cookie被髮回時,這個會話被保存在服務器中。 (注意:我們確實使用完整的瀏覽器作爲REST客戶端,我可以想象當您使用無狀態客戶端時,Cookie將不會被髮回,因此您將丟失會話) – gkephorus

相關問題