2013-01-05 15 views
9

Probabilmente la mia domanda è banale, ma non ho mai usato un bean scope di applicazione prima. Ho bisogno del bean dell'applicazione perché devo fare transazioni che richiedono tempo sul database. la mia ricerca non ha soddisfatto la mia curiosità. Non so perché, ma non sono riuscito a inizializzare il bean (è nullo) o l'app si è bloccata. Così ho un bean ambito di applicazioneJSF application scope instantiation and injection

@ManagedBean(eager=true) 
@ApplicationScoped 
public class ApplicationContainer { 
... 
} 

desiderosi = true Ho letto che dice JSF per avviare il fagiolo ogni volta in cui viene avviato il server di applicazione (io uso GlassFish).

Ho letto in diversi punti che devo solo mettere questa annotazione e il bean viene inizializzato. Per me non ... Dopo che ho letto che se voglio iniettare il chicco di applicazione in un altro bean devo usare @PostConstuct annotazione

@ManagedBean 
@SessionScoped 
public class TestsBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @ManagedProperty(value = "#{container}") 
    private ApplicationContainer container; 

    @PostConstruct 
    public void init() { 
    container.contructContainer(); 
    } 

questo dà un errore in altri fagioli che mi inietto the TestsBean in ...

  • se il bean dell'applicazione viene inizializzato all'avvio del server, quale metodo chiama nel corpo del bean dell'applicazione per eseguire le azioni richieste? O nel bean iniettato è fatto nel metodo post costrutto?

Per favore dimmi il modo corretto di gestire i bean di applicazione. Sono davvero confuso ...

Grazie a tutti per il vostro tempo!

risposta

21

Ci sono 2 potenziali errori.

Per prima cosa, il @ManagedBean(eager=true) funziona, come dice its javadoc, solo su bean gestiti JSF con ambito applicazione. Quindi funziona solo quando hai usato il pacchetto @ApplicationScoped del pacchetto javax.faces.bean (e quindi non il pacchetto javax.enterprise.context!). Il eager=true significa fondamentalmente che il bean verrà auto-istanziato all'avvio di webapp invece che solo successivamente quando viene fatto riferimento per la prima volta in EL.

In secondo luogo, il nome del bean gestito ha come valore predefinito il nome della classe in forma decapitalizzata secondo la specifica Javabeans. Non hai specificato esplicitamente alcun nome di bean gestito come @ManagedBean(name="container", eager=true), quindi il nome del bean gestito verrà impostato su applicationContainer, tuttavia stai ancora tentando di fare riferimento a #{container} anziché a #{applicationContainer}.

Non sei affatto chiaro su quali problemi/errori stai affrontando. Se stai ricevendo un'eccezione, dovresti assolutamente leggerla/interpretarla e, se non sei in grado di comprenderla, copypaste tutto nella sua interezza, compresa la stacktrace, nella domanda. Rappresenta in particolare l'intera risposta al tuo problema. Devi solo interpretarlo e capirlo (o dobbiamo solo spiegarlo in parole povere). Non dovresti davvero ignorarli e lasciare loro la domanda come se fossero decorazioni irrilevanti. Non sono!

Il tutto con tutto, l'approccio completo e corretto sarebbe, con le dichiarazioni d'importazione solo per essere sicuro, e anche stampe stdout qualche povero uomo per il debug:

package com.example; 

import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 

@ManagedBean(eager=true) 
@ApplicationScoped 
public class ApplicationContainer { 

    public ApplicationContainer() { 
     System.out.println("ApplicationContainer constructed"); 
    } 

} 
package com.example; 

import java.io.Serializable; 
import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.SessionScoped; 

@ManagedBean 
@SessionScoped 
public class TestsBean implements Serializable { 

    @ManagedProperty("#{applicationContainer}") 
    private ApplicationContainer container; 

    public TestsBean() { 
     System.out.println("TestsBean constructed"); 
    } 

    @PostConstruct 
    public void init() { 
     System.out.println("ApplicationContainer injected: " + container); 
    } 

    public void setContainer(ApplicationContainer container) { 
     this.container = container; 
    } 

} 
+0

Grazie BalusC per la vostra ampia risposta Non ho inserito la mia eccezione nella domanda perché volevo essere una domanda generale, non specifica. Ho pensato che i bean degli scope dell'applicazione necessitassero di un'inizializzazione più specifica, diversa dal resto e non ho trovato un'inizializzazione corretta, solo frammenti. Ancora grazie per il tuo tempo! – CyberGriZzly