我不知道这是否对你有用。对于如下定义的任何错误,我都有一个处理程序。
在“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>