Session 根据会话属性动态加载数据
我正试图根据用户会话属性动态加载数据集,我将该属性注入并将其设置为namedQuery中的参数 namedQuery工作得很好,但我没有按预期获得数据集 我的意思是,当session属性为9882时,加载的数据集对应于findAll查询。但是,与此同时,如果另一个用户登录到应用程序中,并且他的会话属性为4207,则数据集仍然与9882相同,这意味着数据集仍然对应于findAll查询;反之亦然:如果第1个会话属性为4207,它将使用findByPrefDep查询,正如预期的那样,但对于在该4207用户之后记录的9882会话属性,数据集仍然相同Session 根据会话属性动态加载数据,session,jpa,cdi,Session,Jpa,Cdi,我正试图根据用户会话属性动态加载数据集,我将该属性注入并将其设置为namedQuery中的参数 namedQuery工作得很好,但我没有按预期获得数据集 我的意思是,当session属性为9882时,加载的数据集对应于findAll查询。但是,与此同时,如果另一个用户登录到应用程序中,并且他的会话属性为4207,则数据集仍然与9882相同,这意味着数据集仍然对应于findAll查询;反之亦然:如果第1个会话属性为4207,它将使用findByPrefDep查询,正如预期的那样,但对于在该4207
@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;
}
控制员:
@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;
}
@Inject
私有实例sessionpredep;
公共集合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”);
}
退货项目;
}
您可以通过
@Inject
private Instance<String> SessionPrefDed;
//then in your code
int sesionId = Integer.valueOf(SessionPrepDef.get());
@Inject
私有实例sessionprefed;
//然后在代码中
int sesionId=Integer.valueOf(SessionPrepDef.get());
这样,您应该始终获得一个新的值。但这也取决于如何创建这个对象,据我所知,您只能使用生产者在CDI中注入字符串 在研究了CDI之后,我发现了一本非常好的书,涵盖了解决问题所需的内容。我推荐的这本书是从2013年5月的EJB.3.2版开始的,也是我在第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;
}
}
嗨,彼得·门西克!我真的很感谢你的帮助。非常感谢您分享您的知识!Petr Mensik,我已经测试过了,但不幸的是,它不起作用。会话id将继续与第一个登录应用程序的用户相同。它仍然留在玻璃鱼的记忆中。我已经更新了代码,以显示生产者和注入的参数,正如你告诉我的。拜托,看看我是不是搞错了。谢谢Petr Mensik,我已经找到了解决方案(见上面我的答案)。但是,无论如何,谢谢你的帮助!
//@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;
}
}