2013-01-06 2 views
6

J'ai une structure Beans JSF de ce genre:ManagedProperty de SessionScope dans 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 raison de la transient est que la fève de session a certains membres non sérializable et ne peut pas être Serializable.

Est-ce que cela fonctionnera?
Sinon, comment puis-je résoudre le problème de ne pas pouvoir sérialiser SesionBeany mais de le conserver en tant que propriété gérée sous un bean de vue?

Merci!

+0

Si vous n'êtes pas contraint, vous pourriez tout aussi bien définir votre '' STATE_SAVING_MODE' à server' et éviter d'avoir à sérialiser votre point de vue du client tout à fait – kolossus

Répondre

12

Cela ne fonctionnera pas. Si le bean de portée de la vue est sérialisé, tous les champs transient sont ignorés. JSF ne réinjecte pas les propriétés gérées après la désérialisation, donc vous vous retrouvez avec un bean tronqué de vue sans une propriété bean de portée de session qui ne causera que des NPE.

Dans cette construction particulière, votre meilleur pari est d'introduire le chargement paresseux dans le getter et d'obtenir le bean session par le getter au lieu de l'accès direct au champ.

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

Merci. Je suis juste surpris que JSF n'ait pas de solution "simplifiée" pour ce problème car je suppose que ce n'est pas si rare. – Ben

+2

Je me demandais déjà si cela n'aurait pas dû être un EJB avec état. Les EJB sont injectés en tant que proxies sérialisables, vous n'avez donc pas besoin de vous soucier de la sérialisation. – BalusC

Questions connexes