我认为这可能不是最好的主意:
private static Application app = FacesContext.getCurrentInstance()
.getApplication();
...或者当你无法确定当前执行的线程是否是由servlet请求引起时对FacesContext.getCurrentInstance()的任何其他调用?
我理解它的方式,FacesContext.getCurrentInstance()通过将当前面上下文分配给线程(例如ThreadLocal变量)来工作。以上可能通常在类似JSF支持bean或JSF组件类的类中工作,因为正在加载类并实例化类成员(静态变量)的执行线程通常会是一个FacesServlet请求。但我仍然认为依靠它不是一个好主意。
同意还是不同意?想法?感谢。
答案 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会是一个好主意。