как я могу ловить ошибки глобально, регистрировать их и показывать пользователю страницу с ошибкой в ​​приложении J2EE - PullRequest
1 голос
/ 09 марта 2010

Я немного искал эту тему в Google и видел некоторые лучшие практики. Но мне нужен какой-то конкретный совет. Я работаю над приложением J2EE с сервлетами / Struts2 / Call to DAO от JSP. Так что приложение все запутано. Большая часть данных выбирается с помощью хранимых процедур, которые вызываются 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);

Ответы [ 2 ]

5 голосов
/ 09 марта 2010

Я ожидаю, что это уже каким-то образом решено 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>

затем добавьте сопоставления фильтров для всех ваших сервлетов.

Надеюсь, это поможет.

0 голосов
/ 04 июля 2016

используйте пакет журналирования утилит java, его простой в использовании можно объявить с помощью каждого метода свойства в бэкэнде, в то время как на внешнем интерфейсе, где вы хотите, чтобы ошибка была видимой для пользователя, показывайте ее с помощью тега h: message в xhtml или jsf или также с помощью f: тег обработки ошибок ajax

...