JSF - 在静态上下文中调用FacesContext.getCurrentInstance()

时间:2009-09-29 20:41:07

标签: java jsf static

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

如果必须获取对应用程序的静态引用,则通过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相关错误的攻击。<​​/ p>

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

答案 1 :(得分:1)

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

我无法想象这样一种场景,即将它分配给静态var会是一个好主意。