Я ищу способ регистрации всех моих запросов и ответов в базе данных (1 запись = 1 запрос + 1 ответ).Мой пример использования в деталях:
- Журнал записи в базе данных с URL-адресом запроса, параметрами, IP-адресом, датой начала и т. Д.
- Обновление записи в базе данных (после завершения запроса) и сохранение ответа, исключения, дата окончания и т. д.
Я пытаюсь сделать с пользовательским OncePerRequestFilter, и это работает почти нормально.Но у меня проблема с обработкой исключений, помеченных аннотацией @ResponseStatus
.Такого рода исключения (добавляемые в контроллеры) я не могу уловить в своем собственном методе doFilter.Знаете ли вы, как захватить эти исключения в фильтре?Разве я не должен делать это каким-то другим способом?
AuditFilter:
@Component
public class AuditFilter extends OncePerRequestFilter {
private Logger logger = Logger.getLogger(AuditFilter.class.getName());
private RequestAuditRepository repository;
AuditFilter(RequestAuditRepository repository) {
this.repository = repository;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
doFilterWrapped(wrapRequest(request), wrapResponse(response), filterChain);
}
private void doFilterWrapped(ContentCachingRequestWrapper request, ContentCachingResponseWrapper response, FilterChain filterChain)
throws ServletException, IOException {
RequestAuditLog requestAuditLog = new RequestAuditLog();
String catchedExceptionMsg = null;
try {
beforeRequest(requestAuditLog, request);
filterChain.doFilter(request, response);
}
catch (Exception e) {
// Not called when exception with @ResponStatus annotation throwed
catchedExceptionMsg = e.getMessage();
throw e;
}
finally {
afterRequest(requestAuditLog, catchedExceptionMsg, request, response);
response.copyBodyToResponse();
}
}
...
}
BadRequestException:
@ResponseStatus(HttpStatus.BAD_REQUEST)
public class BadRequestException extends RuntimeException {
public BadRequestException(String message) {
super(message);
}
}