1


1

J2EEアプリでエラーをグローバルにキャッチし、ログに記録してユーザーにエラーページを表示する方法

Googleでこのトピックを少し検索して、いくつかのベストプラクティスを見ました。 しかし、いくつかの具体的なアドバイスが必要です。 私は、JSPからDAOへのサーブレット/ Struts2 / Callを持つJ2EEアプリで作業しています。 そのため、このアプリはすべての種類が台無しになっています。 ほとんどのデータは、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に記録されます。 +しかし、私は次のことをしたいです:

  • ユーザーにカスタムエラーページを提示する

  • server.logの代わりにmyapp.logにエラーを記録します(これは、 log4jを使用する他の場所)

これを行う最善の方法は何ですか? web.xmlに何かを追加する必要がありますか? リスナーのような? それが唯一の変更でしょうか、それとも既存のコードを変更する必要がありますか?

コードはエラーチェックを行いません。 以下のようにSPを呼び出すだけです

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

2 Answer


5


私はこれがすでにStrutsによって何らかの形で解決されていると思っているので、struts doccoをチェックしてください。 私があなただったら、サーブレット呼び出しをラップできるExceptionFilterを書くでしょう:

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に追加します。

  ExceptionFilter
  com.example.ExceptionFilter



  ExceptionFilter
  MyMainServlet

次に、すべてのサーブレットのフィルターマッピングを追加します。

お役に立てば幸いです。


-2


java util logging packageを使用すると、その使いやすさをバックエンドのすべてのプロパティメソッドで宣言できます。フロントエンドでは、xhtmlまたはjsfのh:messageタグまたはf:ajaxエラー処理を使用してユーザーに表示するエラーを表示できますタグ