Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 根据会话属性动态加载数据_Session_Jpa_Cdi - Fatal编程技术网

Session 根据会话属性动态加载数据

Session 根据会话属性动态加载数据,session,jpa,cdi,Session,Jpa,Cdi,我正试图根据用户会话属性动态加载数据集,我将该属性注入并将其设置为namedQuery中的参数 namedQuery工作得很好,但我没有按预期获得数据集 我的意思是,当session属性为9882时,加载的数据集对应于findAll查询。但是,与此同时,如果另一个用户登录到应用程序中,并且他的会话属性为4207,则数据集仍然与9882相同,这意味着数据集仍然对应于findAll查询;反之亦然:如果第1个会话属性为4207,它将使用findByPrefDep查询,正如预期的那样,但对于在该4207

我正试图根据用户会话属性动态加载数据集,我将该属性注入并将其设置为namedQuery中的参数

namedQuery工作得很好,但我没有按预期获得数据集

我的意思是,当session属性为9882时,加载的数据集对应于findAll查询。但是,与此同时,如果另一个用户登录到应用程序中,并且他的会话属性为4207,则数据集仍然与9882相同,这意味着数据集仍然对应于findAll查询;反之亦然:如果第1个会话属性为4207,它将使用findByPrefDep查询,正如预期的那样,但对于在该4207用户之后记录的9882会话属性,数据集仍然相同

@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;
}
}