【问题标题】:how do I catch errors globally, log them and show user an error page in J2EE app如何全局捕获错误、记录错误并向用户显示 J2EE 应用程序中的错误页面
【发布时间】:2010-03-09 16:50:15
【问题描述】:

我在谷歌上搜索了这个主题并看到了一些最佳实践。但我需要一些具体的建议。我正在开发一个 J2EE 应用程序,该应用程序具有从 JSP 到 DAO 的 servlets/Struts2/Call。所以这个应用程序是各种各样的混乱。大多数数据是通过存储过程获取的,由 iBatis ORM/Spring 调用。有时当 SP 端发生错误时,它会向用户显示一条丑陋的消息,如下所示:

javax.servlet.ServletException: org.springframework.jdbc.BadSqlGrammarException: SqlMapClient operation; bad SQL grammar []; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in debtowed.xml.  
--- The error occurred while applying a parameter map.  
--- Check the debtowed.getFormerTenantData.  
--- Check the statement (update procedure failed).  
--- Cause: java.sql.SQLException: ORA-06550: line 1, column 11:
PLS-00905: object package.GET_FORMER_ADDRESS is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

Caused by: java.sql.SQLException: ORA-06550: line 1, column 11:
PLS-00905: object package.GET_FORMER_ADDRESS is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

此时以上信息显示在浏览器中并记录到server.log中。
但是,我想做以下事情:

  • 为用户提供自定义错误页面
  • 在 myapp.log 而不是 server.log 中记录错误(我们在使用 log4j 时在其他一些地方执行此操作)

请告诉我这样做的最佳方法是什么?我应该在 web.xml 中添加一些东西吗?像听众一样?这是唯一的改变还是我必须改变现有的代码?

代码不做任何错误检查。它只是像下面这样调用 SP

getSqlMapClientTemplate().queryForList("sp.getfmrAddy", paramMap);

【问题讨论】:

    标签: logging jakarta-ee error-handling ora-06550


    【解决方案1】:

    我希望 Struts 已经以某种方式解决了这个问题 - 所以最好检查 struts docco。如果我是你,我会编写一个 ExceptionFilter 来包装你的 servlet 调用:

    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.log4j.Logger;
    
    public class ExceptionFilter implements Filter{
    
    private static final Logger logger = Logger.getLogger(ExceptionFilter.class);
    private ExceptionService exceptionService = null;
    @Override
    public void destroy() {
        exceptionService.shutdown();
    }
    
    @Override
    public void doFilter(ServletRequest rq, ServletResponse rs, FilterChain chain) throws IOException, ServletException {
        try {
            chain.doFilter(rq, rs); // this calls the servlet which is where your exceptions will bubble up from
        } catch (Throwable t) {
            // deal with exception, then do redirect to custom jsp page
            logger.warn(t);
            exceptionService.dealWithException(t); // you could have a service to track counts of exceptions / log them to DB etc
            HttpServletResponse response = (HttpServletResponse) resp;
            response.sendRedirect("somejsp.jsp");
        }
    }
    
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
        exceptionService = new ExceptionService();
    }
    
    }
    

    并将其添加到您的 web.xml:

    <filter>
      <filter-name>ExceptionFilter</filter-name>
      <filter-class>com.example.ExceptionFilter</filter-class>
    </filter>
    
    <filter-mapping>
      <filter-name>ExceptionFilter</filter-name>
      <servlet-name>MyMainServlet</servlet-name>
    </filter-mapping>
    

    然后为所有 servlet 添加过滤器映射。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      使用 java util logging 包,它易于使用,可以在后端使用每个属性方法声明,而在前端,您希望用户可以看到错误,使用 xhtml 或 jsf 中的 h:message 标记或 f: ajax错误处理标签

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-22
        • 2013-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 2014-06-25
        相关资源
        最近更新 更多