我在谷歌上搜索了这个主题并看到了一些最佳实践。但我需要一些具体的建议。我正在开发一个 J2EE 应用程序,该应用程序具有 servlet/Struts2/从 JSP 调用 DAO 的功能。所以这个应用程序是各种各样的困惑。大多数数据是通过存储过程获取的,这些存储过程由 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);
最佳答案
我希望 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 添加过滤器映射。
希望有帮助。
关于logging - 如何在 J2EE 应用程序中全局捕获错误、记录错误并向用户显示错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2410808/