Comment puis-je ajouter les Visages des Messages lors @PostConstruct
Dans un backing bean @PostConstruct méthode, je fais un appel d'un EJB qui pourrait revenir certains messages que je veux afficher sur la page via p:messages. Cependant, même si j'ajoute le FacesMessages par exemple FacesContext.getCurrentInstance().addMessage(...), p:messages n'est pas mis à jour avec les FacesMessages.
Si j'ai plutôt l'appel à l'EJB sur une action à partir de la page (un utilisateur clique sur un bouton sur la page qui appelle une méthode qui appelle les EJB, puis ajoute les FacesMessage(s)), alors les messags montrer à l'aide de p:les messages comme prévu.
Comment puis-je ajouter les Visages des Messages lors @PostConstruct et de les faire apparaître lorsque la page est d'abord rendu?
Code:
Page1Controller.java:
@ManagedBean
public class Page1Controller
{
@PostConstruct
public void init()
{
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage("Test Message from @PostConstruct"));
}
public String getValue()
{
return "Some Value";
}
public void triggerMessage(ActionEvent event)
{
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage("Test Message from Trigger Button"));
}
}
page1.xhtml
<h:form>
<p:messages showDetail="true" showSummary="true" autoUpdate="true"/>
<h:outputText value="#{page1Controller.value}"/>
<br/>
<p:commandButton value="Trigger Message"
actionListener="#{page1Controller.triggerMessage}"/>
</h:form>
- Worksforme™. Comment êtes-vous exactement de la création/ajout de messages? Ce JSF impl/version? Est le bean géré par JSF ou CDI ou autre chose?
- Remarque: si invoquer la même méthode (à l'appel de l'EJB, etc) à l'aide de la f:event type="preRenderView" écouteur d'une directive, la FacesMessage est mis à jour correctement. Devrais-je le faire?
- À l'aide de Mojarra 2.1.7, Primefaces 3.2 (dernière version stable).
- Ce serait une solution de contournement.
@PostConstruct
devrait fonctionner très bien pour cela. J'ai fait un test rapide avec Mojarra 2.1.7 et PrimeFaces 3.2 sur Tomcat 7.0.27. Sans un béton SSCCE, nous ne pouvons pas vous aider beaucoup.
Vous devez vous connecter pour publier un commentaire.
Dans votre exemple, le
<p:messages>
est rendu avant le managed bean est construit pour la première fois. Il est alors souvent trop tard pour ajouter le message. Votre bean est construit pour la première fois lorsque la valeur de la<h:outputText>
est été évaluée au cours de temps de rendu.Vous auriez besoin de quelque sorte assurez-vous que le haricot est construit avant la
<p:messages>
est rendu. Dans votre exemple, vous pourriez parvenir, par exemple, en déplaçant le<h:outputText>
à avant<p:messages>
. Ou, par l'ajout d'un<f:viewAction>
ou<f:event type="preRenderView">
qui se invoquée avant l'ensemble de rendu, comme vous l'avez constaté vous-même. Le message de l'ajout n'a pas nécessairement besoin de prendre place dans le port d'écoute de la méthode, par la manière.Voir aussi:
<f:viewParam>
pour cela. Si non, alors le<f:event type="preRenderView">
serait bien (ce qui est mieux pour être remplacé par un plus sain<f:viewAction>
lorsque vous avez la chance de mettre à niveau vers JSF 2.2 plus tard).Vous pouvez collecter de l'erreur, puis l'afficher à la fin de chargement de la page à l'aide d'un remoteCommand de primefaces avec autorun = true mode.
Dans mon cas, j'ai un viewScope et en xhtml je montre la liste de valeurs qui sont chargés dans le @PostConstruct. Si une Exception est générée, je vais l'enregistrer pour l'échantillon à la fin du chargement de la page, s'il existe, à l'aide de la remoteCommand.
code xhtml
showPostConstructError()
méthode ressembler?Pour moi, en utilisant preRenderView événement pour afficher de message sur le formulaire init a été un des messages de l'enfer. J'ai donc créé très simple "composant" pour garder les messages statiques. Pour cet exemple, seul un message d'erreur est pris en charge.
staticMessage.xhtml:
Y compris les messages: