【问题标题】:How to get all instances of a particular cdi session scoped bean如何获取特定 cdi 会话范围 bean 的所有实例
【发布时间】:2014-11-07 11:17:30
【问题描述】:

我有一个@SessionScoped cdi bean,用于在我的 Web 应用程序中跟踪用户会话信息。有没有办法从另一个 @ApplicationScoped bean 中找到这个 bean 的所有对象?

【问题讨论】:

    标签: object find cdi session-bean


    【解决方案1】:

    您不能开箱即用。 Java EE 出于安全原因禁止此类事情。

    现在您可以想象一种更精细的方法来在您的应用程序范围级别跟踪这些会话 bean。最干净的方法是从 @ApplicationScoped bean 生成它们:

    @ApplicationScoped
    public class Registry {
      private List<SessionData> data = new ArrayList<>;
    
      @Produces
      @SessionScoped
      public SessionData produceSessionData() {
        SessionData ret = new SessionData();
        data.add(ret);
        return ret;
      }
    
      public void cleanSessionData(@Disposes SessionData toClean) {
        data.remove(toClean);
      }
    }
    

    注意@Dispose 方法,当您生成的 bean 结束其生命周期时将调用该方法。一种让您的列表保持最新并避免额外内存使用的便捷方式。

    【讨论】:

    • 感谢 Antoine 的宝贵回答。我必须在我的 ApplicationScoped bean 中的 HashMap 的帮助下完成这项工作,当成功登录时,它加载了唯一的 userId 和相关的 SessionScoped bean 的对象,然后从 SessionScoped bean 的 PreDestroy 事件中的 HashMap 中删除相关的会话 bean 对象。我也必须尝试一下您的解决方案。再次感谢。
    猜你喜欢
    • 2017-11-26
    • 2012-01-20
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2014-06-24
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多