2010-02-15 7 views
1

J'ai un tag mediaOutput qui, dans son attribut createContent, nécessite que le bean backing soit dans un certain état. Une liste de valeurs, qui est remplie dans une méthode init, doit être disponible. J'ai donc ajouté une balise keepAlive pour l'ensemble de la fève de support. Je vois maintenant le backingBean à la place de quelques beans proxy (richfaces), mais la liste remplie est à nouveau nulle.richfaces keepAlive ne fonctionne pas

Comment rendre cela possible?

J'ai vérifié que la méthode init a été appelée et que la liste est renseignée dans la méthode init.

<a4j:keepAlive beanName="myBean" /> 
<a4j:mediaOutput createContent="#{myBean.writeChart}" ... /> 

Le backing bean

public class MyBean implements Serializable { 

public List list; 

public void init(ActionEvent event) { 
    // call some resource to fill the list 
    list = service.getItems(); 
} 

public void writeChart(final OutputStream out, final Object data) throws IOException { 
    // list is null 
} 

// getters & setters 
} 

Répondre

2

Déclarez votre haricot pour être session portée.

Si vous avez d'autres informations sur la requête uniquement dans le bean, créez simplement un nouveau bean de portée de requête et déplacez-y tous les autres éléments. C'est parfaitement lisible.

+0

C'est, bien que cela fonctionne, exactement ce que j'ai essayé d'empêcher ... Le bean backing contient d'autres choses pour la même page, en mettant tout sur la portée de la session ne serait pas recommandé . Création d'un haricot séparé pour ce neihter. C'est pourquoi keepAlive a été introduit .. –

+0

oui, mais peut-être que mediaOutput ne passe pas par les mécanismes de requête ajax habituels, c'est votre seul moyen. Peut-être aimeriez-vous utiliser un champ de conversation (orchestre, couture). voir ma mise à jour pour l'autre bean – Bozho

+0

Peut-être yeah :) Mais ils auraient pu documenter cela + la balise mediaOutput fait partie de la spécification a4j, bizarre qu'elle ne supporte pas les autres fonctionnalités de a4j :( –

0

Ce n'est pas un problème. Vous n'avez pas besoin de garder le Mediabean vivant, et vous ne pouvez pas. Le bean qui est donné dans le paramètre createContent sera créé par le composant MediaOutput. Le préfixe "bean" est le plus troublant - il ne s'agit que d'une simple classe java qui contient la méthode paint (...). Vous devez obtenir le bean keepalived (par exemple un bean backing) dans ce simple "bean" en tant que ManagedProperty, et il peut aussi contenir les informations keepalived.

Exemple:

abc.xhtml et ABC.java avec @ManagedBean (name = "ABCBean") et l'annotation @RequestScoped. Vous utilisez ABCBean en tant que Backing Bean avec abc.xhtml, mais PAS dans le paramètre mediaOutput.createContent! Mais vous pouvez créer MediaBean.java avec l'annotation @ManagedBean (name = "MediaBean"), et il a un @ManagedProperty qui obtient l'instance ABCBean dans le MediaBean. Et l'instance ABCBean est keepalived ...