Как я могу регистрировать данные RESTful?

У нас есть службы REST, открытые через Spring MVC. Мы используем исключения HandlerExceptionResolver для журнала. В настоящее время мы регистрируем следующее:

  • Исключение и трассировка стека
  • URL
  • Заголовки запросов

Это облегчило бы отладку, если бы мы могли также зарегистрировать почтовые данные JSON. Любые предложения о том, как это сделать?

Ответ 1

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

Spring содержит AbstractRequestLoggingFilter, что делает аналогичную вещь. Хотя он не подходит для вашей проблемы напрямую, вы можете использовать его в качестве ссылки для реализации собственного фильтра.

Ответ 2

Добавьте это в класс, представляющий конфигурацию для приложения:

import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.filter.AbstractRequestLoggingFilter;

....

@Bean
public Filter loggingFilter(){
    AbstractRequestLoggingFilter f = new AbstractRequestLoggingFilter() {

        @Override
        protected void beforeRequest(HttpServletRequest request, String message) {
            System.out.println("beforeRequest: " +message);
        }

        @Override
        protected void afterRequest(HttpServletRequest request, String message) {
            System.out.println("afterRequest: " +message);
        }
    };
    f.setIncludeClientInfo(true);
    f.setIncludePayload(true);
    f.setIncludeQueryString(true);

    f.setBeforeMessagePrefix("BEFORE REQUEST  [");
    f.setAfterMessagePrefix("AFTER REQUEST    [");
    f.setAfterMessageSuffix("]\n");
    return f;
}

вам может потребоваться прокомментировать

   f.setIncludePayload(true);

Ответ 3

Нет простого способа зарегистрировать полезную нагрузку запроса/ответа. Вы можете использовать веб-фильтр java для перехвата всех запросов и ответов и чтения данных JSON из потока. Но есть одна проблема, когда вы будете читать данные из потока, фактические данные будут исчерпаны из потока.

Следовательно, вы должны реализовать оболочку реального объекта запроса и ответа. Будет зарегистрирована только скопированная версия ответа на запрос. Мы реализовали аналогичное решение, подобное следующему, и оно выполнило наше требование:

http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431

http://angelborroy.wordpress.com/2009/03/04/dump-request-and-response-using-javaxservletfilter/