Обработка исключений в JSF (просмотр) и сохранение этого сообщения об исключении - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть два класса, которые расширяются от ExceptionHandlerWrapper & ExceptionHandlerFactory для перехвата любых исключений, которые происходят в слое представления, и перейдите на страницу ошибок и покажите эту ошибку.Поэтому мне нужно хранить или сохранять эти исключения где-то, но я не могу получить это сообщение об исключении.Я пытался получить это сообщение в сеансе, но мне нужен другой способ сохранить это сообщение без ViewScope, PageFlowScope и RequestScope, поскольку последние возвращают 'null'

import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerFactory;

public class CustomExceptionHandlerFactory extends ExceptionHandlerFactory {

    private ExceptionHandlerFactory parent;

    public CustomExceptionHandlerFactory(ExceptionHandlerFactory parent) {
      this.parent = parent;
    }

    @Override
    public ExceptionHandler getExceptionHandler() {
      ExceptionHandler result = new CustomExceptionHandler(parent.getExceptionHandler());
      return result;
    }
 }

  public class CustomExceptionHandler extends ExceptionHandlerWrapper {
    private ExceptionHandler wrapped;


    public CustomExceptionHandler(ExceptionHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public ExceptionHandler getWrapped() {
        return wrapped;
    }

    @Override
    public void handle() throws FacesException {
        Iterator iterator = getUnhandledExceptionQueuedEvents().iterator();

        while (iterator.hasNext()) {
            ExceptionQueuedEvent event = (ExceptionQueuedEvent) iterator.next();
            ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();


            Throwable throwable = context.getException();
            FacesContext fc = FacesContext.getCurrentInstance();


            // Map<String, Object> sessionMap = fc.getExternalContext().getSessionMap();
             NavigationHandler navigator = fc.getApplication().getNavigationHandler();


            AdfFacesContext adfc = AdfFacesContext.getCurrentInstance();

          Map<String,Object> valueViewScope =   adfc.getViewScope();


            try {
                //  Flash flash = fc.getExternalContext().getFlash();
                // Put the exception in the flash scope to be displayed in the error
                // page if necessary ...
                //  flash.put("errorDetails", throwable.getMessage());

                ADFContext.getCurrent().getSessionScope().put("errorDetails", throwable.getMessage());

                valueViewScope.put("errorDetails", throwable.getMessage());

                System.out.println("the error is put in the Session: " + throwable.getMessage());

                //NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler();
                navigator.handleNavigation(fc, null, "ErrorPage?faces-redirect=true");
                // navigationHandler.handleNavigation(fc, null, "ErrorPage?faces-redirect=true");

                fc.renderResponse();
            } finally {
                iterator.remove();
            }
        }

        // Let the parent handle the rest
        getWrapped().handle();
    }
...