2012-12-06 73 views
2

我只是想知道如何在CDI中開始新的對話。 如果沒有cid請求參數,容器似乎開始一個新對話,但在某些情況下,我想從我的控制器明確啓動一個新對話。JSF CDI(焊接)開始新的對話

示例:JSF頁面用於編輯對話作用域控制器bean的狀態保持。提交一個ajax請求,調用控制器的一個方法,該方法觸發一個事件,將一個應該在新對話中的不同控制器中編輯的子實體傳遞給它。 我無法找到解決方案。 我已經看過Apache Myfaces CODI,但也找不到解決該問題的模式。

請幫我解決。

[編輯] 好的。也許我沒有描述足夠詳細的問題。還有一個嘗試: 如果我想訪問具有不同(新)對話ID的「相同」conversationscoped控制器bean的新實例。這是如何運作的? image你有..讓我們說一個OrderControllerBean來編輯一個Order實體。此控制器具有像public void createSubOrder()這樣的JSF操作方法。這個方法應該創建一個新的Order,並用它做一些奇特的事情。之後,它應該被傳遞給具有不同對話ID的新OrderControllerBean實例。也許通過使用CDI事件。沒關係。問題是:OrderControllerBean已經存在於我的對話中。它用於編輯當前的訂單。所以它不能用來創建和編輯我們剛剛創建的子命令。那麼如何創建一個OrderControllerBean的新實例呢? 也許這不是正確的做法。但到目前爲止,我無法找到另一個可能創建新的對話,而無需將瀏覽器發送到具有空白cid參數的新網址。但之後我無法在這些對話之間交換信息。我如何將會話1中創建的非持久性訂單帶到會話2中的同一個控制器?我的問題只是關於對話的談話。

[編輯] 我讀了整個文檔和所有與它一起到目前爲止的例子。 根據這些聲明(http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#conversationcontext),CDI對話似乎與JSF密切相關。不幸的是我找不到更深入技術細節的文檔。由於發送新請求沒有其他方式來獲得新對話,因此有必要在視圖層直接保存關於新對話如何以及何時開始的邏輯。這絕對不是我能想象的最好方式。我的下一個嘗試是對Seam 3的評估,因爲我記得Seam 2中有一些@Begin和@End註釋,它們可以更好地控制對話。還有一些標籤庫讓你指定對話傳播。我想知道爲什麼其他人沒有類似的問題。目前,CDI在複雜項目中的應用並不廣泛,或者在理解事物應如何運作方面遇到很大問題。到目前爲止,我找不到任何不僅僅是簡單演示的CDI/CODI示例。如果有人鏈接到一個顯示對話高級用法的示例,無論使用哪種便攜式擴展,請讓我知道。

+0

僅僅因爲你不理解它,並不意味着某些東西不被使用。 @ Begin/@ End根本不會幫你。是的,CODI沒有提供很多例子。但是,您必須瞭解某些內容才能正確使用它。你可以通過檢查API/SPI(java)文檔或者在源代碼處詢問。你唯一的問題是你喜歡將一個實例從一個已關閉的實例傳遞給一個新的實例。如果沒有在轉換過程中處於活動狀態的存儲,這種方法無法正常工作如果你有這個,它完全支持CODI(但不是標準的CDI對話)。其餘的是在我的答案'編輯'。 –

回答

0
@Inject 
    private Conversation conversation; 

conversation.begin(); 
conversation.end(); 

很容易谷歌呢?究竟是什麼問題?

+0

閱讀我的文章。那麼你知道。 – hidehawk

+0

嘗試使用僞代碼來更好地描述它。我仍然不能理解你的功能要求。如果某件事情與CDI很難做,那麼你有可能做錯事 –

0

你是什麼意思的「開火事件」; JSF,ajax,CDI事件?
爲什麼你想爲你的子實體開始一個新的對話?
我想你應該以某種方式從客戶端請求子實體編輯頁面,而不需要附加cid。以便該子實體的控制者獲得新的瞬態對話。然後,您可以在其@PostConstruct方法中開始。 AFAIK無法在同一請求中啓動新的(或重新啓動)對話。

+0

我的意思是CDI事件。問題是,我知道如何開始一個新的CDI對話的唯一方法是打開一個空白cid參數的新網頁。在控制器邏輯中不可能獲得新的對話,並且稍後可以將用戶重定向到適當的頁面(可能)。 jsf前端總是知道,會話中發生了什麼,但我想管理控制器邏輯內的對話,因爲我的應用程序太複雜,無法將所有內容放入jsf頁面。 – hidehawk

2

使用CODI,一個bean的對話將自動開始。只要你訪問它。您可以同時進行多個對話。標準。 CDI對話更像CODI的窗口範圍。但即使在這裏,CODI也會更好。

Std。 CDI會話需要#begin,但這是一個問題,到驗證錯誤。在這種情況下,你一次又一次地創建你的bean。我放棄了標準的使用。兩週後進行CDI對話,因爲在許多比一天演示更爲複雜的應用中,它們完全被破壞。我找到了http://os890.blogspot.co.at/2011/04/slides-codi-conversations.html,這幫助我理解了爲什麼CODI團隊做了他們自己的CDI範圍。

另外你所描述的是與CODI輕鬆。

[編輯]:你在「編輯」添加什麼 不能沒有第二豆在所有的工作,但你永遠不會得到一個新的窗口ID。 如果您只需要一個新的(/重新啓動)對話範圍bean實例,則可以使用: org.apache.myfaces.extensions.cdi.core.api.scope.conversation.Conversation#restart 您需要第二個調用類似控制器的bean#getXyz控制器#重新啓動(它本身稱爲對話#重新啓動),然後是控制器#setXyz。但是,這聽起來很髒,你正在嘗試做什麼。

+0

嘿。感謝您的回覆。我閱讀了所有的CODI文檔,但找不到有關開始新對話的任何內容。有指定的會話組等,但這不是我所需要的。我只想從後端的某個地方開始一個新的,不受約束的獨立對話,而無需提交新的瀏覽器請求。 – hidehawk

+0

你不必開始他們!只需訪問豆類,其餘的只是起作用。您也不要啓動其他示波器,如請求範圍... –

+0

再次感謝您的補充。也許CODI完成這項工作。我會繼續嘗試。 – hidehawk

相關問題