我对Faces消息有一个奇怪的问题。
有时,<p:growl>, <p:messages>
在执行某些方法后正确显示通知。但是有一些特定的JSF页面没有显示通知。
例如:
public String create() {
try {
getFacade().create(current);
JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("NotaCreated"));
return prepareCreate();
} catch (Exception e) {
JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
return null;
}
}
该方法在
中调用<h:commandLink action="#{notaController.create}" value="#{bundle.CreateNotaSaveLink}"/>
它没有显示通知。但对于其他实体以及其他操作,消息会正确显示。在其他功能中也会发生这种情况,我需要反馈并且没有按预期显示。
我一直在寻找并阅读this post并尝试了一些建议的解决方案,包括在commandButtons和commandLinks中设置ajax=false
属性或使用发布的脚本,但这些都不适用于我所以我问这个问题,希望有人可以帮助我。
我是否必须配置一些东西以使其正常工作?我明天需要这个才能修好,我不知道还能做什么。
更新
这些是JsfUtil方法:
public static void addSuccessMessage(String msg) {
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);
FacesContext.getCurrentInstance().addMessage("successInfo", facesMsg);
}
public static void addErrorMessage(Exception ex, String defaultMsg) {
String msg = ex.getLocalizedMessage();
if (msg != null && msg.length() > 0) {
addErrorMessage(msg);
} else {
addErrorMessage(defaultMsg);
}
}
这是Create.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<ui:composition template="/template.xhtml">
<ui:define name="title">
<h:outputText value="#{bundle.CreateNotaTitle}"></h:outputText>
</ui:define>
<ui:define name="body">
<h:panelGroup id="messagePanel" layout="block">
<h:messages errorStyle="color: red" infoStyle="color: green" layout="table"/>
</h:panelGroup>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel value="#{bundle.CreateNotaLabel_fecha}" for="fecha" />
<p:calendar value="#{notaController.selected.fecha}" id="fecha"/>
<h:outputLabel value="#{bundle.CreateNotaLabel_observaciones}" for="observaciones" />
<p:inputTextarea rows="4" cols="30" id="observaciones" value="#{notaController.selected.observaciones}" title="#{bundle.CreateNotaTitle_observaciones}" />
<h:outputLabel value="#{bundle.CreateNotaLabel_tipoNota}" for="tipoNota" />
<p:selectOneMenu id="tipoNota" value="#{notaController.selected.tipoNota}" required="true" requiredMessage="#{bundle.CreateNotaRequiredMessage_tipoNota}">
<f:selectItem itemLabel="---"/>
<f:selectItem itemValue="debito" itemLabel="Débito"/>
<f:selectItem itemValue="credito" itemLabel="Crédito"/>
</p:selectOneMenu>
<h:outputLabel value="#{bundle.CreateNotaLabel_monto}" for="monto" />
<p:inputText id="monto" value="#{notaController.selected.monto}" title="#{bundle.CreateNotaTitle_monto}" required="true" requiredMessage="#{bundle.CreateNotaRequiredMessage_monto}"/>
<h:outputLabel value="#{bundle.CreateNotaLabel_factura}" for="factura" />
<p:selectOneMenu id="factura" converter="#{facturaController.convertidor}" value="#{notaController.selected.factura}" filter="true" filterMatchMode="startsWith" required="true" requiredMessage="#{bundle.CreateNotaRequiredMessage_factura}">
<f:selectItem itemLabel="---"/>
<f:selectItems value="#{facturaController.facturas}" var="factura" itemValue="#{factura}" itemLabel="#{factura.idFactura}" />
</p:selectOneMenu>
</h:panelGrid>
<br />
<h:commandLink action="#{notaController.create}" value="#{bundle.CreateNotaSaveLink}">
<f:setPropertyActionListener value="#{cargaController.crearCargaDefault(sesionMB.usuario)}"
target="#{notaController.selected.carga}"/>
</h:commandLink>
<br />
<br />
<h:commandLink action="#{notaController.prepareList}" value="#{bundle.CreateNotaShowAllLink}" immediate="true"/>
<br />
<br />
<h:link outcome="/inicio" value="#{bundle.CreateNotaIndexLink}"/>
</h:form>
</ui:define>
</ui:composition>
答案 0 :(得分:1)
我遇到了同样的问题。 faces消息未呈现它丢失。我尝试了这段代码,但它确实有效。
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);
FacesContext context = FacesContext.getCurrentInstance();
context.getExternalContext().getFlash().setKeepMessages(true);
context.addMessage("successInfo", facesMsg);
我希望它有效。