异常时不会重定向到错误页面

时间:2013-04-18 13:12:27

标签: jsf error-handling oracle-adf jsf-1.2

如果发生异常,我正试图导航到错误页面。为此我定义了:

<error-page>
    <error-code>500</error-code>
    <location>/error.jspx</location>
</error-page> 
web.xml中的

。我也试过通过Servlet做到这一点:

<servlet>
    <servlet-name>ErrorHandler</servlet-name>
    <servlet-class>web.servlet.ErrorHandler</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ErrorHandler</servlet-name>
    <url-pattern>/errorhandler</url-pattern>
</servlet-mapping>
<error-page>
    <error-code>500</error-code>
    <location>/errorhandler</location>
</error-page>

但它既没有导航到error.jspx也没有ErrorHandler Servlet被调用。

为了测试错误处理,我尝试了来自托管bean的构造函数和throw new Exception("Test");的{​​{1}}。但是它在控制台中打印异常,但重定向没有发生。

我也试过:actionListener而不是<exception-type>java.lang.Exception</exception-type>,但没有运气。如果在构造函数或某些<error-code>500</error-code> / action之类的任何地方发生任何异常,我如何调用Servlet或导航到页面?

1 个答案:

答案 0 :(得分:0)

我不知道这是否会为你服务。 我有一个处理程序,用于定义如下任何错误。

在“faces-config.xml”

 <factory> 
     <exception-handler-factory> 
        com.mypackage.global.DatExceptionHandlerFactory 
     </exception-handler-factory>
  </factory> 

两个班级

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

public class DatExceptionHandlerFactory extends ExceptionHandlerFactory {

      private ExceptionHandlerFactory parent;

      // this injection handles jsf
      public DatExceptionHandlerFactory(ExceptionHandlerFactory parent) {
        this.parent = parent;
      }

      //create your own ExceptionHandler
      @Override
      public ExceptionHandler getExceptionHandler() {
        ExceptionHandler result =
            new DatExceptionHandler(parent.getExceptionHandler());
        return result;
      }
    }

第二课

import java.util.Iterator;
import javax.faces.FacesException;
import javax.faces.application.NavigationHandler;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.faces.event.ExceptionQueuedEvent;
import javax.faces.event.ExceptionQueuedEventContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class DatExceptionHandler extends ExceptionHandlerWrapper {

      private static Log log = LogFactory.getLog(DatExceptionHandler.class);
      private ExceptionHandler wrapped;
      public  String error = "n";


      public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }

    public DatExceptionHandler(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();

          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());

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

              NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler();

              navigationHandler.handleNavigation(fc, null, "components/errorHandler.xhtml?faces-redirect=true");

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

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

errorHandler.xhtml显示错误

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">

<h:head>
  <link type="text/css" rel="stylesheet" href="#request.contextPath}/css/default.css" /> 
  <title>#{bundle['guessNumber.error_page.title']}</title>
</h:head>

<h:body>
    <div class="highlighted errorMessage">
        <h:outputText escape="false" 
                      value="#{bundle['guessNumber.error_page.content']}"/>
    </div>
    <br/><br/>
    <div class="errorDetails">
        Error details: <br/>
        #{flash.keep.errorDetails}
    </div>
</h:body>
</html>