Pergunta

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 -.-

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top