我有这样的xhtml:
<a4j:outputPanel id="displayGraph" layout="block" style="clear:both; margin-top: 0px; margin-left: 80px;margin-bottom: 20px;">
<a4j:mediaOutput element="img" cacheable="false" session="false" createContent="#{generateGraph.paint}" value="#{graph}" mimeType="image/png" standby="Loading" />
</a4j:outputPanel>
<a4j:outputPanel id="errorMessage" ajaxRendered="true">
<h:messages id="messages" styleClass="message" errorClass="errormsg" infoClass="infomsg" warnClass="warnmsg"/>
</a4j:outputPanel>
我也有支持bean的paint方法,如果方法给出异常,它会生成消息。像这样:
public void paint(OutputStream os, Object data) {
try{
//some actions
} catch (IOException e) {
e.printStackTrace();
FacesMessages.instance().add(Severity.ERROR, "Sorry connection can not be achieved");
}
} else {
FacesMessages.instance().add(Severity.ERROR, "Sorry server does not exist");
}
}
现在消息永远不会显示。有谁可以告诉我我做错了什么?
提前致谢
答案 0 :(得分:0)
FacesMessages是一个会话范围的接缝组件。假设您正在使用临时对话,则会发生以下情况:
您可以在a4j:outputPanels中添加#{conversation.id}
,并在paint()
方法中记录对话ID,从而对此进行测试。
这个问题有两个解决方案。您可以开始长时间对话,然后添加到您的mediaOutput。另一个解决方案是不使用FacesMessages,而是使用自定义的PAGE范围组件来保留您的消息。
您还可以切换到RichFaces4,其中包含每个richfaces组件的“render”参数,这样可以确保在与初始mediaOutput AJAX请求相同的请求中发出重新渲染。