Hi,
I resolve similar problem by next MessagesPhaseListener and saving
message text into session bean:
1. Create class MessagesPhaseListener
----------------------------------
public class MessagesPhaseListener implements PhaseListener {
public MessagesPhaseListener() {
}
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
public void beforePhase(PhaseEvent phaseEvent) {
FacesContext ctx;
MySession session;
ctx = phaseEvent.getFacesContext();
session = ServiceLocator.getMySession();
// Error Messages Handle
if (session.isErrorMessage()) {
ctx.addMessage(null, new
FacesMessage(FacesMessage.SEVERITY_ERROR, session.popErrorMessage(),
null));
}
}
public void afterPhase(PhaseEvent phaseEvent) {
}
}
----------------------------------
2. In any session bean eg. MySession create methods for messages stack
or simple remembering one message:
----------------------------------
private String errMessage;
public void setErrorMessage(String msg) {
errMessage = msg;
}
public boolean isErrorMessage() {
return (errMessage != null);
}
public String popErrorMessage() {
String msg = errMessage;
errMessage = null;
return msg;
}
----------------------------------
3. Register MessagesPhaseListener in faces-config.xml as eg.:
<lifecycle>
<phase-listener>com.company.xxx.MessagesPhaseListener</phase-listener>
</lifecycle>
4. ServiceLocator is my help class, where i get reference to session
bean roughly by this steps:
FacesContext ctx = FacesContext.getCurrentInstance();
ValueBinding vb =
ctx.getApplication().createValueBinding("#{MySession}");
return (MySession)vb.getValue(ctx);
Hope this help. Have nice day,
Petr
sed wrote:
Hi,
I am trying to write some general way to handle application errors
with JSF.
I understand application error as error after that user redirected to
some error page.
In my implementation application error is FacesMessage with
SEVERITY_FATAL.
I have wrote ApplicationErrorsSupervisor, see code below.
But after redirecting to errors.faces all messages are discarded. And
therefore user doesn't see his fatal error. How can I using JSF add
all messages to view to redirect?
public class ApplicationErrorsSupervisor implements PhaseListener {
public void afterPhase(PhaseEvent event) {}
public void beforePhase(PhaseEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
String viewId = context.getViewRoot().getViewId();
if(viewId.equals(Constants.VIEW_ERROR))
return;
Iterator messages = context.getMessages();
while(messages.hasNext()) {
FacesMessage message = (FacesMessage) messages.next();
if(message.getSeverity() == FacesMessage.SEVERITY_FATAL) {
context.getApplication().getNavigationHandler().handleNavigation(context,
null, "error");
}
}
}
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
}