OncePerRequestFilter - обработка исключений, аннотированных @ResponseStatus - PullRequest
0 голосов
/ 10 июня 2018

Я ищу способ регистрации всех моих запросов и ответов в базе данных (1 запись = 1 запрос + 1 ответ).Мой пример использования в деталях:

  1. Журнал записи в базе данных с URL-адресом запроса, параметрами, IP-адресом, датой начала и т. Д.
  2. Обновление записи в базе данных (после завершения запроса) и сохранение ответа, исключения, дата окончания и т. д.

Я пытаюсь сделать с пользовательским 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);
    }
}

1 Ответ

0 голосов
/ 20 июня 2018

Я думаю, что BadRequestException обрабатывается даже до того, как ваш пользовательский фильтр срабатывает, и поэтому вы не можете перехватить это исключение в своем фильтре.

Что вы могли бы сделать, так это написать свой собственный ExceptionHandlerв дополнение к вашему фильтру и зарегистрируйте свои вещи там.

@ControllerAdvice
public class MyExceptionHandler {

  @ExceptionHandler(BadRequestException.class)
  public void handleError(BadRequestException ex) {
     // do your stuff here
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...