2012-10-22 17 views
5

Ho un gruppo di desiderosiApplicationScoped fagioli gestiti. Alcuni di essi sono iniettati in altri dall'annotazione ManagedProperty, formando un albero di dipendenze. Ogni fagiolo dipendente manipola il suo genitore dopo la costruzione.Fagioli gestiti ApplicationScoped Eager costruiti più volte

Tuttavia, sembra che venga creata una nuova istanza per ciascuna iniezione, rendendo così inutili le precedenti manipolazioni. A mio modo di vedere, un bean ApplicationScoped deve essere creato una sola volta. Ho frainteso o perché sta succedendo questo? È perché sono desiderosi?

Ecco un esempio:

ParentBean.java

package example; 

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

@ManagedBean(eager = true) 
@ApplicationScoped 
public class ParentBean 
{ 
    static int initCount = 0; 

    // ... 

    @PostConstruct 
    public void init() 
    { 
     ++initCount; // Will end up being between 1 and 3. Expected always 1. 

     // ... 
    } 
} 

Child1Bean.java

package example; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 

@ManagedBean(eager = true) 
@ApplicationScoped 
public class Child1Bean 
{ 
    @ManagedProperty("#{parentBean}") ParentBean parentBean; 

    public ParentBean getParentBean() 
    { 
     return parentBean; 
    } 

    public void setParentBean(ParentBean parentBean) 
    { 
     this.parentBean = parentBean; 
    } 

    @PostConstruct 
    public void init() 
    { 
     // manipulate parentBean 
    } 
} 

Child2Bean.java

package example; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 

@ManagedBean(eager = true) 
@ApplicationScoped 
public class Child2Bean 
{ 
    @ManagedProperty("#{parentBean}") ParentBean parentBean; 

    public ParentBean getParentBean() 
    { 
     return parentBean; 
    } 

    public void setParentBean(ParentBean parentBean) 
    { 
     this.parentBean = parentBean; 
    } 

    @PostConstruct 
    public void init() 
    { 
     // manipulate parentBean 
    } 
} 
+2

puoi dare un esempio di codice di come lo fai? –

+0

Ok, ho aggiunto un esempio. – Spomf

+0

non penso che cambierò, ma prova '@ManagedProperty (value =" # {parentBean} ")', – Daniel

risposta

0

Ho stessi problemi con Mojarra 2.0 .X. Immagino che il problema sia connesso con l'inizializzazione JSF multithread. Prova a disabilitarlo con il parametro com.sun.faces.enableMultiThreadedStartup.

+0

Grazie, ma non ha avuto alcun effetto. La mia applicazione è in esecuzione su Mojarra 2.1.6. – Spomf

+0

Hai risolto? Ho lo stesso problema –

1

Ho risolto il problema con Tomcat 8 + Mojarra 2.2.0. Nel mio caso ho appena rimosso dichiarazione ascoltatore dalla web.xml

<listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
</listener> 

Constructor sembra di essere chiamato una volta in seguito.

Informazioni sulla voce listener, c'è una parte della risposta BalusC alla domanda this.

In ogni caso, la registrazione esplicita di ConfigureListener di Mojarra in web.xml è in realtà solo necessario aggirare vecchi server buggy, come GlassFish v3 e Jetty che è riuscito a trovare l'ascoltatore in file di TLD Mojarra. Se distribuito su un server decente, l'intera voce non è necessaria.

Problemi correlati