JSF2: Как инициировать услуги при развертывании [дубликат
Вопрос
Этот вопрос уже имеет ответ здесь:
Для университетского проекта я разрабатываю webapplation с JSF. Мое управление - сделать интерфейс. Предполагается, что товарищ представляет собой бэкэнд. Обе детали предназначены для привлечения приложений. Оба общаются через RMI. Я хочу открыть соединение один раз в развертывании.
Я в точке, чтобы успокоиться сейчас. Я пытался сделать это с механизмом @applationscoped:
//Constructor of ApplicationScoped ManagedBean
public Communication() {
this.connect();
}
Это возможно? Я попробовал, но менеджер, кажется, не называться ..
Можете ли вы совет лучшей практикой?
@Bris: К сожалению, я не использую EJB вообще-.-
@ Balusc's Pot: я создал общениебен:
@ManagedBean(name="communication")
@ApplicationScoped
public class Communication {
public static FrontendCommInterface server;
public Communication() {
this.connect();
}
Тогда я создал боевик:
@ManagedBean
@ViewScoped
public class Login {
@ManagedProperty(value="#{communication}")
private Communication communicationBean;
public FrontendCommInterface server;
private String username;
private String password;
public Login() {
server = communicationBean.getConnection();
}
public String login(){
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
String sessionId = session.getId();
try {
server.login(getUsername(), getPassword(), sessionId);
return "start.xhtml";
} catch (RemoteException e) {
e.printStackTrace();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Anmeldung nicht erfolgreich: ", getUsername()+", "+getPassword()+", "+sessionId));
return "login.xhtml";
}
}
Но, к сожалению, это бросает исключения:
com.sun.faces.mgbean.ManagedBeanCreationException: Klasse org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login can not be instanciated.
java.lang.NullPointerException
org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login.<init>(Login.java:28)
После отладки я узнал, что мой управляемый Это не было создано! Как это сделать? Я думал, что ссылается через ManagedProperty, будет создать это -.-
Решение
Управляемый боб - только автоматически создан всякий раз, когда это было указано EL #{managedBeanName}
, что может произойти либо доступ к тому, как есть в представлении, либо путем введения в качестве управляемого свойства другого компонента или быть вруженым разрешенным, например, Application#evaluateExpressionGet()
.
В вашем конкретном случае вы фактически хотите использовать некоторые вещи во время запуска WebApp. Вы скорее хотите использовать ServletContextListener
за это.
@WebListener
public class Config implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
// Do stuff during webapp's startup.
}
public void contextDestroyed(ServletContextEvent event) {
// Do stuff during webapp's shutdown.
}
}
Вы можете даже предварительно создать приложение Scoped управляемый боб, когда необходимо (если ваша цель - быть в состоянии получить доступ к нему из других бобов @ManagedProperty
).
public void contextInitialized(ServletContextEvent event) {
event.getServletContext().setAttribute("bean", new Bean());
}
JSF хранит приложение Scoped Beans в качестве атрибута ServletContext
И JSF не будет автоматически создать еще один, когда он уже присутствует, поэтому тот, который и то же самое, что создается приведенным выше приведенным выше примером кода, будет использоваться JSF.
Другие советы
Если вы можете использовать EJB 3.1 Lite {1} в вашем веб-приложении, вы можете использовать Singleton Session Bean, аннотированный с помощью метода @startup и методом @postconstruct. У меня есть тот, который выглядит как:
@Singleton
@Startup
public class CachePrimer {
@PostConstruct
public void loadOpenRequests() {
...
}
}
{1}: EJB 3.1 Lite включен в веб-профиль javee 6 и предоставляется серверами веб-профиля, как Стеклянная рыба, Jboss 6., а также Смола. Отказ При использовании такого сервера веб-сайта вы просто включаете свои EJBS в свой файл .war, ни одна дополнительная работа не требуется.