2014-10-07 42 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