【问题标题】:Dynamically loading data according to a session attribute根据会话属性动态加载数据
【发布时间】:2014-10-07 16:09:10
【问题描述】:

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

namedQuery 工作正常,但我没有得到想要的数据集。

我的意思是,当session属性为9882时,加载的dataSet对应的是findAll查询。但是与此同时,如果另一个用户登录应用程序-并且他的会话属性为4207-dataSet仍然与9882相同,这意味着dataSet仍然对应于findAll查询;反之亦然:如果第一个会话属性是 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;
}

有谁知道我怎样才能实现所需的控制?

提前致谢。

----------- 新章节

制作人:

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

【问题讨论】:

    标签: session jpa cdi


    【解决方案1】:

    你可以通过

    @Inject
    private Instance<String> SessionPrefDed;
    
    //then in your code
    int sesionId = Integer.valueOf(SessionPrepDef.get());
    

    通过这种方式,您应该始终获得新的价值。但这也取决于您如何创建此对象,据我所知,您只能通过生产者在 CDI 中注入字符串。

    【讨论】:

    • 嗨彼得·门西克!我真的很感谢你的帮助。非常感谢您分享您的知识!
    • Petr Mensik,我已经测试过了,但不幸的是,它没有用。对于登录应用程序的第一个用户,会话 ID 将继续保持相同。它仍然在Glassfish的记忆中。正如你告诉我的那样,我已经更新了代码以显示 Producer 和注入的参数。拜托,看看我是不是弄错了。谢谢!
    • Petr Mensik,我找到了解决方案(请参阅上面的答案)。但是,无论如何,感谢您的帮助!
    【解决方案2】:

    在研究了 CDI 之后,我找到了一本非常好的书,其中涵盖了解决我的问题所需的内容。我推荐的书是 Apress Starting 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;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 2018-08-10
      相关资源
      最近更新 更多