Domanda

    

Questa domanda ha già una risposta qui:

         

Per progetto universitario Sto sviluppando un'applicazione web con JSF. La mia esercitazione è quello di fare il frontend. Un collega studend dovrebbe fare cose backend. Entrambe le parti sono progettati per essere applicazioni seerate. Entrambi comunicano attraverso RMI. Voglio aprire la connessione una volta in fase di distribuzione.

Sono sul punto di risolvere la connessione ora. Ho cercato di farlo con un @ApplicationScoped ManagedBean:

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

È in questo modo possibile? Ho provato ma il managedBean sembra di non essere chiamato ..

Si può consigliare una Best Practice?


@ Brian: Purtroppo io non uso EJB affatto -.-

@ pot di BalusC: Ho creato una communicationbean:

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

    public static FrontendCommInterface server;

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

Poi ho creato il 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";
    }
}

Ma purtroppo genera eccezioni:

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)

Dopo debuging ho scoperto che il mio ManagedProperty è Null! Non è stato creato! Come farlo? Ho pensato riferimento tramite managedproperty creerebbe lo -.-

È stato utile?

Soluzione

Il bean gestito è auto-creata ogni volta che è stato riferito da EL #{managedBeanName}, che può avvenire per sia accedendo come-è in vista solo, o per essere iniettato come proprietà gestita di un altro bean, o essere manualmente EL-risolto da esempio Application#evaluateExpressionGet().

Nel vostro caso particolare, si vuole realmente inizializzare alcune cose durante l'avvio del webapp. È piuttosto desidera utilizzare ServletContextListener per questo.

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

}

Si potrebbe anche pre-creare un'applicazione ambito bean gestito non in caso di necessità (se il vostro intento è quello di essere in grado di accedervi da altri fagioli da @ManagedProperty).

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

esercizi JSF applicazione scope fagioli come un attributo del ServletContext e JSF non sarà automaticamente creare un altro quando si è già presente, così l'uno e lo stesso creato dall'esempio codice precedente saranno utilizzati da JSF pure .

Altri suggerimenti

Se è possibile utilizzare EJB 3.1 lite {1} nel vostro web app, quindi è possibile utilizzare un Singleton Session Bean, annotato con @Startup, e un metodo @PostConstruct. Ho uno che assomiglia a:

@Singleton
@Startup
public class CachePrimer {

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

{1}: EJB 3.1 lite è incluso nel Web Profilo di JavEE 6, ed è fornito dai server nel profilo web come Glassfish , JBoss 6 , e resina . Quando si utilizza un server di profilo web, è sufficiente includere il tuo EJB nel file .war, non è richiesto alcun lavoro supplementare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top