Правильное место для установки кода инициализации в JSF? - PullRequest
0 голосов
/ 06 марта 2012

Где правильное «место» в JSF для размещения следующего фрагмента инициализации, чтобы он выполнялся только один раз при запуске сервера?

1.  ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext();
2.  HttpSession sesion = (HttpSession)extContext.getSession(true); 
3.  String parA = extContext.getInitParameter("parA");
4.  String parB = someCalculations(parA);       
5.  sesion.setAttribute("parB", parB);

В основном я хочу прочитать параметр parA из раздела context-param web.xml, выполнить некоторые преобразования и включить его в сеанс (как новый параметр parB).

PostConstructApplicationEvent и eager = true методы не работают, потому что в данный момент сессия пуста (строка 4). Техника ServletContextListener не работает, потому что FacesContext недоступен.

Спасибо!

1 Ответ

0 голосов
/ 06 марта 2012

Нет сеансов во время запуска приложения;это требование невозможно выполнить.

Я интерпретирую ваши требования следующим образом:

  • выполнить дорогостоящее вычисление области применения
  • внедрить этот результат области применения в другие области

Способ JSF сделать это через управляемые bean-компоненты.Вот бин области приложения, который выполняет однократное преобразование параметра контекста:

package foo;

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

@ManagedBean
@ApplicationScoped
public class SomeCalculationsBean {
  @ManagedProperty("#{initParam.paraA}")
  private String paraA;

  private String someCalculation;

  public String getParaA() {
    return paraA;
  }

  public void setParaA(String paraA) {
    this.paraA = paraA;
    this.someCalculation = //do some transformation
  }

  public String getSomeCalculation() {
    return someCalculation;
  }
}

Это значение затем может быть введено в другие области по мере необходимости:

package foo;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class SomeSessionBean {
  @ManagedProperty("#{someCalculationsBean.someCalculation}")
  private String paraB;

  public String getParaB() {
    return paraB;
  }

  public void setParaB(String paraB) {
    this.paraB = paraB;
  }
}

Код не проверен.Эта реализация предполагает поддержку аннотаций JSF, но вы можете сделать то же самое с faces-config.xml конфигурацией компонента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...