Прав ли я, думая, что это может быть не лучшая идея:

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

... или любой другой вызов FacesContext.getCurrentInstance (), когда вы не можете быть уверены, что текущий поток выполнения вызван запросом сервлета?

Насколько я понимаю, FacesContext.getCurrentInstance () работает путем присвоения текущего контекста лиц потоку (например, переменной ThreadLocal). Вышеупомянутое, вероятно, обычно будет работать в классе, таком как поддерживающий компонент JSF или класс компонента JSF, поскольку поток выполнения, который загружает класс и создает экземпляры членов класса (статические переменные), обычно быть запросом FacesServlet. Но я все еще не думаю, что на это стоит рассчитывать.

Согласны или не согласны? Идеи? Спасибо.

1
Michael Lucas 30 Сен 2009 в 00:41
Определенно не лучшая идея. В чем здесь коренная проблема? Может быть, мы сможем предложить лучшее решение.
 – 
Drew
1 Окт 2009 в 00:52
Я не совсем уверен - это не мой код! Меня назначили в проект после того, как было собрано много вещей, и теперь я исправляю дефекты и т. Д. Если у меня будет время, я изучу его и вернусь к вам. Ваше здоровье.
 – 
Michael Lucas
1 Окт 2009 в 18:09

2 ответа

Лучший ответ

Использование FacesContext.getCurrentInstance () во время инициализации может быть или не быть хорошей идеей в зависимости от контекста.

Я не могу представить себе сценарий, при котором назначение его статической переменной когда-либо было бы хорошей идеей.

1
jsight 30 Сен 2009 в 01:33

Это не похоже на то, что вы действительно хотели бы делать.

Если вы должны получить статическую ссылку на приложение, инициализируя ее с помощью 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
McDowell 30 Сен 2009 в 13:50