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;
 }
}

Reply via email to