4

例外が発生した場合、エラー ページに移動しようとしています。そのために私は定義しました:

<error-page>
    <error-code>500</error-code>
    <location>/error.jspx</location>
</error-page> 

web.xml。また、サーブレットでこれをやろうとしました:

<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サーブレットが呼び出されることもありません。

エラー処理をテストするためにthrow new Exception("Test");、マネージド Bean のコンストラクターと の両方から試みましたactionListener。しかし、コンソールに例外を出力していますが、リダイレクトは行われていません。

私も試してみました:<exception-type>java.lang.Exception</exception-type>代わりに<error-code>500</error-code>、しかし運が悪い。actionコンストラクターや一部の/などの場所から例外が発生したときに、サーブレットを呼び出したり、ページに移動したりするにはどうすればよいactionListenerですか?

4

1 に答える 1

0

これがあなたに役立つかどうかはわかりません。次のように定義されたエラーのハンドラーがあります。

「faces-config.xml」内

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

しかも2クラス

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 に答える