Question

    

Cette question a déjà une réponse ici:

         

Pour le projet universitaire, je développe une application Web avec JSF. Mon excercise est de faire le frontend. Un homme studend est censé faire des choses de back-end. Les deux parties sont conçus pour être des applications seerate. Les deux communiquent par RMI. Je veux ouvrir la connexion une fois au déploiement.

Je suis au point pour régler la connexion maintenant. J'ai essayé de le faire avec un @ApplicationScoped ManagedBean:

//Constructor of ApplicationScoped ManagedBean  
public Communication() {
    this.connect();
}

Est-ce possible façon? Je l'ai essayé mais le managedBean ne semble pas être appelé ..

Pouvez-vous conseiller une meilleure pratique?


@ Brian: Malheureusement, je n'utilise pas du tout EJB -.-

@ pot de BalusC: J'ai créé un communicationbean:

@ManagedBean(name="communication")
@ApplicationScoped
public class Communication {

    public static FrontendCommInterface server;

    public Communication() {
        this.connect();
    }

Je créé le 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";
    }
}

Mais malheureusement, il jette des exceptions:

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)

Après debug j'ai découvert que mon ManagedProperty est nul! Il n'a pas été créé! Comment faire ça? Je pensais que le référencement par le managedproperty serait créer -.-

Était-ce utile?

La solution

Le bean géré est uniquement créée automatiquement à chaque fois que cela a été référencé par EL #{managedBeanName}, ce qui peut se produire soit par l'accès à tel quel en vue, soit en étant injecté comme propriété gérée d'un autre haricot, ou étant EL-réglé manuellement par exemple Application#evaluateExpressionGet().

Dans votre cas, vous voulez vraiment intialize quelques trucs pendant le démarrage de webapp. Vous voulez plutôt utiliser pour cette 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.
    }

}

Vous pouvez même avant de créer une application, il scope bean géré si nécessaire (si votre intention est de pouvoir y accéder à partir d'autres haricots par @ManagedProperty).

    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute("bean", new Bean());
    }

l'application JSF stocke scope haricots comme un attribut de la ServletContext et JSF ne sera pas automatiquement créer un autre quand on est déjà présent, de sorte que l'un et le même que celui créé par l'exemple de code ci-dessus sera utilisé par JSF et .

Autres conseils

Si vous pouvez utiliser EJB 3.1 Lite {1} dans votre application web, vous pouvez utiliser une session Singleton Bean, annotée avec @Startup, et une méthode @PostConstruct. J'ai une qui ressemble à:

@Singleton
@Startup
public class CachePrimer {

    @PostConstruct
    public void loadOpenRequests() {
         ...
    }
}

{1}: EJB 3.1 Lite est inclus dans le profil Web de JavEE 6, et est fourni par les serveurs de profil web comme Glassfish, JBoss 6 et Résine . Lorsque vous utilisez un serveur de profil web, il vous suffit d'inclure votre dans votre fichier EJB .war, il faut pas de travail supplémentaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top