Информация, которую вы даете в своем вопросе, на самом деле немного скудна, но я все равно попробую.
Ограничение регистрации исключений теми, которые происходят во время обработки запроса (согласно вашему комментарию), ваш первый шаг должен был бы установить Фильтр сервлета:
@WebFilter(filterName="exceptionHandler", urlPatterns="/*")
public class ExceptionHandler extends HttpFilter {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, HttpSession session, FilterChain chain) throws ServletException, IOException {
try {
chain.doFilter(request, response);
} catch (Exception e) {
// ... handle exception here
}
}
}
Если у вас уже установлены другие фильтры, вам, вероятно, понадобится web.xml
для настройки порядка их вызова.
Следующим шагом является асинхронное сохранение в БД. Здесь все зависит от того, какой стек вы используете, кроме JSF и Hibernate. Например, Java EE имеет удобную аннотацию @Asynchronous
здесь, в то время как в Spring это @Async
. В целом, JSF чаще всего объединяется с Java EE, но люди, утверждающие, что вместо JPA используют Hibernate, как правило, используют Tomcat.
Для Java EE вы должны внедрить EJB в Фильтр, при этом EJB использует JPA (возможно, Hibernate) и упомянутую аннотацию @Asynchronous
:
Фильтр:
@WebFilter(filterName="exceptionHandler", urlPatterns="/*")
public class ExceptionHandler extends HttpFilter {
@EJB
private ExceptionPersister exceptionPersister;
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, HttpSession session, FilterChain chain) throws ServletException, IOException {
try {
chain.doFilter(request, response);
} catch (Exception e) {
exceptionPersister.persist(e);
}
}
}
EJB:
@Stateless
public class ExceptionPersister {
@PersistenceContext
private EntityManager entityManager;
@Asynchronous
public void persist(Exception exception) {
// use entityManager to persist exception in your
// specific way.
}
}