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

时间:2014-10-07 16:09:11

标签: session jpa cdi

我尝试根据用户会话属性动态加载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;
}

2 个答案:

答案 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;
}
}