2

Google でこのトピックを少し検索したところ、いくつかのベスト プラクティスが見つかりました。しかし、具体的なアドバイスが必要です。私は、サーブレット/Struts2/JSP からの DAO への呼び出しを持つ 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);
4

2 に答える 2

6

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

<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>

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

それが役立つことを願っています。

于 2010-03-09T17:18:33.807 に答える
-2

Java util logging パッケージを使用する 使いやすいバックエンドのすべてのプロパティ メソッドで宣言できますが、ユーザーにエラーを表示させたいフロント エンドでは、xhtml または jsf で h:message タグを使用するか、f:ajax エラー処理を使用して表示します鬼ごっこ

于 2016-07-04T08:54:51.633 に答える