我有一个@SessionScoped cdi bean,它用于跟踪Web应用程序中的用户 session 信息。有什么方法可以从另一个@ApplicationScoped bean中找到此bean的所有对象吗?

最佳答案

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

现在,您可以想象出一种更精细的方法来在您的应用程序范围级别跟踪这些 session 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结束其生命周期时将调用该方法。一种方便的方法,可以使列表保持最新状态,并避免额外的内存使用。

10-02 23:30