Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

En proyecto universitario estoy desarrollando una aplicación web con JSF. Mi ejercicio es hacer el frontend. Un compañero Studend se supone que debe hacer cosas backend. Ambas partes están diseñados para ser seerate aplicaciones. Ambos se comunican a través de RMI. Quiero abrir la conexión una vez en la implementación.

Estoy en el punto en que conformarse con la conexión ahora. Traté de hacer eso con un @ApplicationScoped ManagedBean:

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

Es posible que manera? Lo probé pero el managedBean parece no ser llamados ..

Se puede aconsejar una Buena Práctica?


@ Brian: Por desgracia yo no uso de EJB en absoluto -.-

@ olla de BalusC: He creado un communicationbean:

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

    public static FrontendCommInterface server;

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

Luego creó el 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";
    }
}

Pero, desgraciadamente, lanza excepciones:

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)

Después de debuging descubrí que mi ManagedProperty es nulo! No ha sido creada! ¿Como hacer eso? Pensé referencia a través de managedproperty que crearía -.-

¿Fue útil?

Solución

El bean administrado sólo es creada automáticamente cada vez que ha sido referenciado por EL #{managedBeanName}, lo que puede ocurrir por cualquiera que accede estado en que está a la vista, o por ser inyectado como propiedad administrada de otro bean, o ser manualmente EL-resueltos por ejemplo, Application#evaluateExpressionGet().

En su caso particular, en realidad se quiere inicializar algunas cosas durante el inicio de la aplicación web. Usted vez que desee utilizar ServletContextListener para esto.

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

}

Incluso se puede crear previamente una aplicación de ámbito bean gestionado allí cuando es necesario (si su intención es ser capaz de acceder a él desde otros granos por @ManagedProperty).

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

tiendas JSF con ámbito frijoles como un atributo de la ServletContext y JSF no auto-crear otro cuando uno está ya presente, así que la una y la misma como creado por el ejemplo el código de seguridad será utilizado por JSF así .

Otros consejos

Si puede utilizar EJB 3.1 Lite {1} en su aplicación web, entonces usted puede utilizar un método @PostConstruct Singleton Bean de sesión, anotado con @Startup, y. Tengo uno que se parece a:

@Singleton
@Startup
public class CachePrimer {

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

{1}: EJB 3.1 Lite está incluido en el perfil web de Javee 6, y es proporcionado por los servidores web prestigiosos como Glassfish , JBoss 6 , y Resina . Cuando se utiliza un servidor web, tales perfil, sólo tiene que incluir sus EJB en el archivo .war, no se requiere trabajo adicional.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top