JSF2: Como iniciar serviços na implantação [duplicado
Pergunta
Esta pergunta já tem uma resposta aqui:
Para o Projeto da Universidade, estou desenvolvendo uma aplicação da Web com a JSF. Meu exercício é fazer o front -end. Um colega de cravo deve fazer coisas de back -end. Ambas as peças foram projetadas para serem aplicações. Ambos se comunicam através do RMI. Quero abrir a conexão uma vez na implantação.
Estou no momento de resolver a conexão agora. Eu tentei fazer isso com um @applicationscoped gerenciado:
//Constructor of ApplicationScoped ManagedBean
public Communication() {
this.connect();
}
É assim possível? Eu tentei, mas o ManagedBean parece não ser chamado ..
Você pode aconselhar uma prática recomendada?
@Brian: Infelizmente, eu não uso o EJB --.-
@Balusc's Pot: Eu criei um CommunicationBean:
@ManagedBean(name="communication")
@ApplicationScoped
public class Communication {
public static FrontendCommInterface server;
public Communication() {
this.connect();
}
Então eu criei o LoginBean:
@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";
}
}
Mas, infelizmente, lança exceções:
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)
Após a depuração, descobri que minha profortidade gerenciada é NULL! Não foi criado! Como fazer isso? Eu pensei que a referência via GerenedProperty criaria -o -.-
Solução
O feijão gerenciado é apenas criado automaticamente sempre que for referenciado por El #{managedBeanName}
, o que pode acontecer acessar como está em vista, ou sendo injetado como propriedade gerenciada de outro feijão, ou sendo resolvido manualmente por por exemplo, Application#evaluateExpressionGet()
.
No seu caso específico, você realmente deseja intializar algumas coisas durante a startup do WebApp. Você prefere usar ServletContextListener
por esta.
@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.
}
}
Você pode até pré-criar um feijão gerenciado com escopo de aplicativo lá sempre que necessário (se sua intenção for capaz de acessá-lo de outros feijões por @ManagedProperty
).
public void contextInitialized(ServletContextEvent event) {
event.getServletContext().setAttribute("bean", new Bean());
}
JSF armazena o aplicativo Scoped Beans como um atributo do ServletContext
E o JSF não criará automaticamente outro quando um já estiver presente; portanto, o mesmo e o mesmo criado pelo exemplo de código acima também será usado pelo JSF.
Outras dicas
Se você pode usar o ejb 3.1 lite {1} no seu aplicativo da web, poderá usar um feijão de sessão singleton, anotado com @startup e um método @postconstruct. Eu tenho um que parece:
@Singleton
@Startup
public class CachePrimer {
@PostConstruct
public void loadOpenRequests() {
...
}
}
{1}: EJB 3.1 Lite está incluído no perfil da Web de Javee 6 e é fornecido por servidores de perfil da Web como Peixe de vidro, Jboss 6, e Resina. Ao usar um servidor de perfil da Web, basta incluir seus EJBs no seu arquivo .war, nenhum trabalho adicional é necessário.