4

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

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

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

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

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

4

1 回答 1

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>
于 2014-02-25T12:00:00.943 回答