Представьте, что у вас есть фильтр, который запускает транзакцию базы данных, обрабатывает запрос, а затем пытается зафиксировать транзакцию.
doFilter(...) {
...
transaction.begin();
filterChain.doFilter(request, response);
transaction.commit();
}
При использовании Джерси возникают некоторые проблемы:
- Используя фильтр, контейнер сервлетов Джерси фиксирует/сбрасывает ответ до того, как выполнение вернется к вашему фильтру. Итак, если фиксация не удалась, вы не можете изменить код возврата, чтобы он был неудачным. Кроме того, JAX-RS ExceptionMapper не будет перехватывать исключения.
Использование ContainerRequestFilter/ContainerResponseFilter.
фильтр public ContainerRequest (запрос ContainerRequest) { ... }
фильтр public ContainerResponse (запрос ContainerRequest, ответ ContainerResponse) { ... }
Это позволяет исключениям подниматься до ExceptionMapper, но разделяет логику на 2 отдельных метода/интерфейса. Проблема в том, что если есть исключение, которое не соответствует ответу, ContainerResponseFilter никогда не вызывается, поэтому вы не можете его очистить.
Каков предпочтительный способ справиться с этим в среде JAX-RS? Есть ли способ настроить очистку ответа или есть класс или интерфейс, который я пропускаю?
ExceptionMapper<SpecificException>
. КакойExceptionMapper<?>
будет обрабатывать исключение? Сначала дляSpecificException
, а потом дляThrowable
? Или последний проглотитSpecificException
? 10.10.2013