Frage

Für ein Universitätsprojekt entwickle ich eine Webanwendung mit JSF.Meine Aufgabe besteht darin, das Frontend zu erstellen.Ein Kommilitone soll Backend-Sachen machen.Beide Teile sind für mehrere Anwendungen konzipiert.Beide kommunizieren über RMI.Ich möchte die Verbindung einmal bei der Bereitstellung öffnen.

Ich bin gerade dabei, die Verbindung herzustellen.Ich habe versucht, das mit einem @ApplicationScoped ManagedBean zu machen:

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

Ist das möglich?Ich habe es versucht, aber die ManagedBean scheint nicht aufgerufen zu werden.

Können Sie uns eine Best Practice empfehlen?


@Brian:Leider nutze ich EJB überhaupt nicht -.-

@BalusCs Topf:Ich habe eine Kommunikationsbean erstellt:

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

    public static FrontendCommInterface server;

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

Dann habe ich das LoginBean erstellt:

@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";
    }
}

Aber leider löst es Ausnahmen aus:

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)

Nach dem Debuggen habe ich herausgefunden, dass mein ManagedProperty Null ist!Es wurde nicht erstellt!Wie geht das?Ich dachte, eine Referenzierung über „managedproperty“ würde es schaffen –.-

War es hilfreich?

Lösung

Die verwaltete Bean wird nur dann automatisch erstellt, wenn EL darauf verweist #{managedBeanName}, was geschehen kann, indem man entweder so zugreift, wie es in der Ansicht ist, oder indem man es als verwaltete Eigenschaft einer anderen Bean injiziert oder manuell EL-auflöst, z. B. Application#evaluateExpressionGet().

In Ihrem speziellen Fall möchten Sie tatsächlich einige Dinge während des Starts der Webanwendung initialisieren.Sie möchten lieber verwenden ServletContextListener dafür.

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

}

Sie können dort bei Bedarf sogar eine verwaltete Bean mit Anwendungsbereich vorab erstellen (wenn Sie beabsichtigen, von anderen Beans aus darauf zugreifen zu können). @ManagedProperty).

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

JSF speichert anwendungsbezogene Beans als Attribut von ServletContext und JSF erstellt nicht automatisch ein weiteres, wenn bereits eines vorhanden ist, sodass dasselbe, das im obigen Codebeispiel erstellt wurde, auch von JSF verwendet wird.

Andere Tipps

Wenn Sie EJB 3.1 lite {1} in Ihrem Web-App verwenden können, dann können Sie eine Singleton Session Bean verwenden, mit @Startup kommentierten und ein @PostConstruct Verfahren. Ich habe ein, das aussieht wie:

@Singleton
@Startup
public class CachePrimer {

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

{1}: EJB 3.1 Lite wird im Web-Profil von JavEE 6 enthalten ist, und wird von Web-Profil-Server wie Glassfish , JBoss 6 und Harz . Wenn ein solches Web-Profil-Server verwenden, einfach Sie Ihre EJBs in Ihrer WAR-Datei enthalten, ist keine zusätzliche Arbeit erforderlich ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top