【问题标题】:JSF - calling FacesContext.getCurrentInstance() in a static contextJSF - 在静态上下文中调用 FacesContext.getCurrentInstance()
【发布时间】:2010-12-02 11:05:54
【问题描述】:

我是否认为这可能不是最好的主意:

private static Application app = FacesContext.getCurrentInstance()
        .getApplication();

... 或任何其他对 FacesContext.getCurrentInstance() 的调用,当您无法确定当前执行线程是由于 servlet 请求引起的?

按照我的理解,FacesContext.getCurrentInstance() 通过将当前面上下文分配给线程(例如 ThreadLocal 变量)来工作。上面可能通常在像 JSF 支持 bean 或 JSF 组件类这样的类中工作,因为恰好加载类和实例化类成员(静态变量)的执行线程通常会是一个 FacesServlet 请求。但我仍然认为依靠它不是一个好主意。

同意还是不同意?想法?谢谢。

【问题讨论】:

  • 绝对不是一个好主意。这里的根本问题是什么?也许我们可以提供更好的解决方案。
  • 我不太确定——这不是我的代码!在构建了很多东西之后,我被分配到该项目,现在我正在修复缺陷等。如果我有时间,我会调查它并回复你。干杯。

标签: java jsf static


【解决方案1】:

这看起来不像是你真正想做的事情。

如果您必须获得对应用程序的静态引用,那么通过ApplicationFactory 对其进行初始化可能是更好的方法:

public final class CustomApplicationFactory extends ApplicationFactory {
  private static volatile Application APPLICATION;
  private final ApplicationFactory decorated;

  public CustomApplicationFactory(ApplicationFactory decorated) {
    this.decorated = decorated;
  }

  @Override public Application getApplication() {
    APPLICATION = decorated.getApplication();
    return APPLICATION;
  }

  @Override public void setApplication(Application application) {
    APPLICATION = application;
    decorated.setApplication(application);
  }

  public static Application getApp() {
    return APPLICATION;
  }
}

这将在您的faces-config.xml 中注册。如果您不将其隔离到单个应用程序,则此演示类容易受到 ClassLoader 相关错误的影响。

可能有更好的方法来做你想做的任何事情。

【讨论】:

    【解决方案2】:

    在初始化期间使用 FacesContext.getCurrentInstance() 可能是一个好主意,也可能不是一个好主意,具体取决于上下文。

    不过,我无法想象将它分配给静态 var 的场景会是一个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-28
      • 2020-05-24
      • 2011-08-26
      • 2011-05-27
      • 2014-04-15
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      相关资源
      最近更新 更多