2014-10-07 60 views
0

我想動態加載數據集相應的用戶會話屬性,我注入並將其設置爲namedQuery中的參數。根據會話屬性動態加載數據

namedQuery工作正常,但我沒有得到所需的數據集。

我的意思是,當會話屬性爲9882時,加載的dataSet對應於findAll查詢。但是,與此同時,如果另一個用戶登錄應用程序,並且他的會話屬性爲4207,那麼dataSet仍然與9882相同,這意味着dataSet仍然對應於findAll查詢;反之亦然:如果第一個會話屬性爲4207,則按預期使用findByPrefDep查詢,但對於在該4207用戶之後記錄的9882會話屬性,dataSet仍然相同。

@Inject 
private String SessionPrefDep; 

public Collection<T> getItems() { 
    if (items == null) { 
    if (Integer.valueOf(SessionPrefDep) == 4207) { 
     items = this.ejbFacade.findByPrefDep(); 
     } else if (Integer.valueOf(SessionPrefDep) == 9882) { 
      items = this.ejbFacade.findAll(); 
     } 
    } 
    return items; 
} 

有誰知道我該如何達到理想的控制?

在此先感謝。

-----------新節

生產者:

@ApplicationScoped 
public class BeanCDI { 

private final String sessionPrefDep = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("xPrefDep"); 

@Produces 
public String SessionPrefDep() { 
    return sessionPrefDep; 
    } 
} 

控制器:

@Inject 
private Instance<String> SessionPrefDep; 

public Collection<T> getItems() { 

    int sessionId = Integer.valueOf(SessionPrefDep.get()); 

    if ((items == null) && (sessionId == 4207)) { 
     items = this.ejbFacade.findByPrefDep(); 
     System.out.print("****************** findByPrefDep() - sessionId:" + sessionId); 
    } else if ((items == null) && (sessionId == 9882)) { 
     items = this.ejbFacade.findAll(); 
     System.out.print("****************** findAll() - sessionId:" + sessionId); 
    } 
    return items; 
} 

回答

0

經過對CDI的研究,我找到了一本很好的書,涵蓋了我需要解決我的問題。我推薦的這本書是Apress Beginning EJB.3.2nd Edition May2013,以及我在第10章中找到的解決方案。

我唯一需要改變的是我的Producer中的CDI範圍。這樣做,問題就解決了:

//@ApplicationScoped --> I was wrongly, for my needs, using this scope... 
@RequestScoped 
public class BeanCDI { 

private final String sessionPrefDep = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("xPrefDep"); 

@Produces 
public String SessionPrefDep() { 
return sessionPrefDep; 
} 
} 
1

您可以通過

@Inject 
private Instance<String> SessionPrefDed; 

//then in your code 
int sesionId = Integer.valueOf(SessionPrepDef.get()); 
做到這一點

這種方式你應該總是得到一個新的價值。但是這也取決於你如何創建這個對象,據我記得你可以在CDI中只向生產者注入字符串。

+0

嗨Petr Mensik!我非常感謝你的幫助。非常感謝你分享你的知識! – jMarcel 2014-10-08 12:28:38

+0

歡迎您!它有幫助嗎? – 2014-10-08 12:31:02

+0

Petr Mensik,我已經測試過,但不幸的是,它沒有工作。會話ID繼續與登錄該應用程序的第一個用戶相同。它仍然是Glassfish的記憶。我已經更新了代碼來顯示Producer和注入的參數,就像你告訴我的一樣。請看看我是否犯了一個錯誤。謝謝! – jMarcel 2014-10-09 18:21:55