Прав ли я, думая, что это может быть не лучшая идея:
private static Application app = FacesContext.getCurrentInstance()
.getApplication();
... или любой другой вызов FacesContext.getCurrentInstance (), когда вы не можете быть уверены, что текущий поток выполнения вызван запросом сервлета?
Насколько я понимаю, FacesContext.getCurrentInstance () работает путем присвоения текущего контекста лиц потоку (например, переменной ThreadLocal). Вышеупомянутое, вероятно, обычно будет работать в классе, таком как поддерживающий компонент JSF или класс компонента JSF, поскольку поток выполнения, который загружает класс и создает экземпляры членов класса (статические переменные), обычно быть запросом FacesServlet. Но я все еще не думаю, что на это стоит рассчитывать.
Согласны или не согласны? Идеи? Спасибо.
2 ответа
Использование FacesContext.getCurrentInstance () во время инициализации может быть или не быть хорошей идеей в зависимости от контекста.
Я не могу представить себе сценарий, при котором назначение его статической переменной когда-либо было бы хорошей идеей.
Это не похоже на то, что вы действительно хотели бы делать.
Если вы должны получить статическую ссылку на приложение, инициализируя ее с помощью 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
, если вы не держите его изолированным от одного приложения.
Вероятно, есть лучший способ делать то, что вы пытаетесь сделать.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].