当前位置:  开发笔记 > 前端 > 正文

JSF 1.x通用异常处理

如何解决《JSF1.x通用异常处理》经验,为你挑选了3个好方法。

如果我的业务层中有异常(例如我的JDBC连接bean中的SQL异常),我如何将自定义消息传播到全局error.jsp页面?



1> McDowell..:

虽然您可以使用导航规则(假设表单发布)重定向到错误页面,但JSF 1.x不提供此类型的任何隐式错误处理...



Handle a generic error outcome that might be returned
by any application Action.

Generic Error Outcome
loginRequired
/must-login-first.jsp

...或使用重定向...

FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
String url = extContext.encodeActionURL(extContext
        .getRequestContextPath()
        + "/messages.faces");
extContext.redirect(url);

我建议查看JSF规范以获取更多详细信息.

可以根据需要将错误消息放在请求范围/会话范围/ url参数上.


假设有一个Servlet容器,您可以使用通常的web.xml错误页面配置.


    java.lang.Exception
    /errorPage.faces

在您的支持bean中,您可以在RuntimeException中包装并抛出已检查的异常.

一些JSF实现/框架将捕获这些错误(Apache MyFaces/Facelets),因此您将不得不配置它们.



2> authentictec..:

JSF 2现在有一个处理异常的机制:

http://java.sun.com/javaee/6/docs/api/javax/faces/context/ExceptionHandler.html



3> 小智..:

我在站点中创建了一个错误页面,并将错误的堆栈跟踪放入此代码中,首先将其放在web.xml中


                500
                /errorpage.jsf

虽然jsf页面有这个代码





    
    



PLAN SEGURO
Error de ejecución
Ocurrio un error al realizar la operación, favor de intentarlo nuevamente, si el error aún se presenta, favor de notificarlo a soporte técnico al 5147-31-00 extensión 6893

请注意,motif允许您调试堆栈跟踪,以了解隐藏字段中的异常.让我们看看如何定义类恢复StackTrace

public class ErrorDisplay implements Serializable{

    private static final long serialVersionUID = 6032693999191928654L;
    public static Logger LOG=Logger.getLogger(ErrorDisplay.class);

    public String getContacto() {
        return "";
    }

    public String getStackTrace() {
        FacesContext context = FacesContext.getCurrentInstance();
        Map requestMap = context.getExternalContext().getRequestMap();
        Throwable ex = (Throwable) requestMap.get("javax.servlet.error.exception");

        StringWriter writer = new StringWriter();
        PrintWriter pw = new PrintWriter(writer);
        fillStackTrace(ex, pw);
        LOG.fatal(writer.toString());

        return writer.toString();
    }

    private void fillStackTrace(Throwable ex, PrintWriter pw) {
        if (null == ex) {
            return;
        }

        ex.printStackTrace(pw);

        if (ex instanceof ServletException) {
            Throwable cause = ((ServletException) ex).getRootCause();

            if (null != cause) {
                pw.println("Root Cause:");
                fillStackTrace(cause, pw);
            }
        } else {
            Throwable cause = ex.getCause();

            if (null != cause) {
                pw.println("Cause:");
                fillStackTrace(cause, pw);
            }
        }
    }
}

并且在文件facesconfig中完成此bean定义时已经附加了


            
                Bean que sirve para llenar la especificacion de un error. Stacktrace 
            
            errorDisplay
            mx.com.tdc.datos.page.bean.ErrorDisplay
            session
        

我希望这会有用

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有