Джерси WebApplicationException и фильтры сервлетов - PullRequest
2 голосов
/ 13 июля 2011

В моем приложении я выкидываю исключения WebApplicationException для случаев, когда я могу передавать хорошие сообщения с моими 500-ми. Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть фильтр сервлетов для транзакций гибернации, и я заметил, что WebApplicationException перехватывается до того, как он возвращается к фильтру сервлетов. В качестве примера я включил краткую версию моего фильтра сервлетов. Примечание: у меня есть только один другой фильтр сервлетов, который выполняет аутентификацию и не имеет перехватов

    try {
        em = MauiPersistenceUtil.getEntityManager();
        em.getTransaction().begin();

        // raises WebApplicationException
        filterChain.doFilter(request, response);

        // since WebApplicationException is trapped somewhere else up 
        // the filterChain bad data is committed here
        em.getTransaction().commit();
    } catch (Throwable ex) {
        // I want the WebApplicationException to reach here
        em.getTransaction().rollback();
    }

Спасибо, Выкуп

Редактировать: Райан Стюарт указал, что я на самом деле не задавал вопрос. Мой вопрос: как я могу сказать в фильтре сервлетов, что исключение веб-приложения было выброшено в filterChain? Я ожидал, что Джерси сбросит исключение, но это было неверно.

Ответы [ 2 ]

4 голосов
/ 13 июля 2011

Поскольку вы не задавали конкретного вопроса, я сделаю несколько замечаний.

  1. Вы должны использовать декларативные транзакции, такие как предоставляемые Spring, вместо того, чтобы пытаться управлять ими таким образом, именно потому, что вы столкнетесь с такими проблемами.
  2. Аналогично 1. Я очень сомневаюсь, что вы захотите откатить транзакции для всех исключений. Опять же, посмотрите на структуру, чтобы помочь вам в этом.
  3. Исключение WebApplicationException перехватывается и обрабатывается Джерси. Предположительно, вы управляете Джерси стандартным способом, как сервлет. Фильтры выполняются вокруг сервлетов. Следовательно, сервлет Джерси обрабатывает исключение до того, как его удалит фильтр.
1 голос
/ 30 декабря 2013

Вы должны проверить статус ответа после «doFilter»:

 filterChain.doFilter(servletRequest, servletResponse);

 Integer status = ((HttpServletResponse) servletResponse).getStatus();
 if (HttpServletResponse.SC_INTERNAL_SERVER_ERROR.equals(status) {
     em.getTransaction().rollback();
 } else {
     em.getTransaction().commit();
 }

Если статус равен 500, откат, так просто. Вы никогда не получите WebApplicationException для фильтров сервлетов, они отслеживаются сервлетом Джерси.

...