2013-01-06 17 views
6

Ho un Fagioli struttura JSF di questo tipo:ManagedProperty of SessionScope all'interno di un bean ViewScoped - Transient?

@ManagedBean 
@ViewScoped 
public class ViewBeany implements Serializable { 

.... 
    @ManagedProperty(value='#{sessionBeany}) 
    transient private SessionBeany sessionBeany; 
... 

    public getSessionBeany() { ... }; 
    public setSessionBeany(SessionBeany sessionBeany) { ... }; 

} 

La ragione per la transient è che la session bean ha alcuni membri non serializzabile e non può essere fatta Serializable.

Funzionerà?
In caso contrario, come posso risolvere il problema di non poter serializzare SesionBeany ma doverlo mantenere come una proprietà gestita in un bean con ambito di visualizzazione?

Grazie!

+0

Se non sei così costretti, si potrebbe anche solo impostare il '' STATE_SAVING_MODE' per server' ed evitare di dover serializzare l'immagine per il cliente del tutto – kolossus

risposta

12

Questo non funzionerà. Se il bean con ambito di visualizzazione è serializzato, tutti i campi transient vengono saltati. JSF non reinvia le proprietà gestite dopo la deserializzazione, quindi si finisce con un bean con ambito di visualizzazione senza una proprietà del bean con scope di sessione che causerà solo NPE.

In questo particolare costrutto, la soluzione migliore è introdurre il caricamento lazy nel getter e ottenere il bean di sessione dal getter invece che dall'accesso diretto al campo.

private transient SessionBeany sessionBeany; 

public SessionBeany getSessionBeany() { // Method can be private. 
    if (sessionBeany == null) { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     sessionBeany = context.getApplication().evaluateExpressionGet(context, "#{sessionBeany}", SessionBeany.class); 
    } 

    return sessionBeany; 
} 
+0

Grazie. Sono solo sorpreso che JSF non abbia una soluzione "semplificata" per questo problema, perché suppongo che non sia così raro. – Ben

+2

Mi chiedevo già se non avrebbe dovuto essere un bean di stato. Gli EJB sono iniettati come proxy serializzabili, quindi non ti devi preoccupare della serializzazione. – BalusC