2012-11-13 123 views
0

我遇到了我的會話作用域bean的奇怪行爲。我用以下的進口和註釋,使其sessionscoped:@SessionScoped bean @ViewScoped行爲

編輯:更多的代碼

import javax.enterprise.context.SessionScoped; 
    import javax.inject.Named; 

    @Named 
    @SessionScoped 
    public class DetailsBean implements Serializable { 

    private LinkedHashMap<String, String> folder; 
    @Inject 
    private ApplicationBean appBean; 
    @Inject 
    private UserBean userBean; 

    @PostConstruct 
    public void resolveID() { 
    this.folder = new LinkedHashMap<String, String>(); 
    for (LinkedHashMap<String, String> tempfolder : appBean.getRepositoryContent()) { 
     if (tempfolder.get("text:nodeid").equals(URLid)) { 
      this.folder = tempfolder; 
      } 
     } 
    } 

JSF頁面的代碼片段:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:rich="http://richfaces.org/rich"> 
    <f:metadata> 
     <f:viewParam name="id" value="#{detailsBean.URLid}" required="true" requiredMessage="You must provide an Object Id"/> 
     <f:event type="preRenderView" listener="#{detailsBean.resolveID}" /> 
    </f:metadata> 
    <h:head> 
     <title>Dataset #{detailsBean.name}</title> 
    </h:head> 
    <h:body> 
    <h:form> 
     <h:panelGrid columns="2" columnClasses="fixed-column"> 
      Name <h:inputText value="#{detailsBean.name}" 
           id="name" required="true" 
           requiredMessage="name required"/> 
      <rich:message for="name" ajaxRendered="true"/> 
     </h:panelGrid> 
    </h:body> 
    </h:form> 
    </html> 

現在,當我點擊一個鏈接在我的JSF頁面這樣的一個DetailsBean被實例化。當我點擊另一個具有不同內容的鏈接時,使用相同的bean,因爲我仍然在同一個Session中。現在奇怪的是,即使我創建了2個不同的瀏覽器標籤,即使在刷新頁面後,它們也顯示不同的內容。同一個bean實例如何顯示不同的內容?我通常認爲只有一個@ViewScoped bean可以實現這一點?不要誤會我我想讓他們展示不同的內容,所以@ViewScoped將是在這裏使用的正確決定,但我只是想知道這是如何可能的...

EDIT2:當我使用javax.faces.ViewScoped ,上面的代碼不工作了(我得到java.io.NotSerializableException因爲LinkedHashMap中的那麼)

+0

它不應該是可能的,但如果你有一些邏輯事情在你的支持者,你是不知道的,那麼有可能。請發佈更多代碼。 – Catfish

+0

好吧我編輯。 jsf頁面上的內容使用文件夾映射並從中獲取字符串。 – nico1510

+0

你能發佈使用這個支持bean的視圖代碼片段嗎? – Catfish

回答

-1

我相信你有進口線錯誤。 import javax.enterprise.context.SessionScoped;。您應該從javax.faces.bean.SessionScoped導入註釋。

+0

OP正在通過CDI'@ Named'而不是JSF'@ ManagedBean'管理bean。即便如此,如果導入確實是錯誤的,它會默認請求範圍,因此絕對不會像範圍視圖那樣操作。 – BalusC

相關問題