我尝试根据用户会话属性动态加载dataSet,我将其注入并将其设置为namedQuery中的参数。
namedQuery运行正常,但我没有按照需要获取数据集。
我的意思是,当session属性为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 :(得分:1)
您可以通过
执行此操作@Inject
private Instance<String> SessionPrefDed;
//then in your code
int sesionId = Integer.valueOf(SessionPrepDef.get());
这样你应该总是得到一个新的价值。但这也取决于你如何创建这个对象,据我记得你只能在生产者的CDI中注入字符串。
答案 1 :(得分:0)
在研究了CDI之后,我发现了一本非常好的书,涵盖了我解决问题所需的内容。我推荐的这本书是Apress Beginning EJB.3.2nd Edition May2013,以及我在第10章中找到的解决方案。
我唯一需要改变的是我的制作人的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;
}
}