Сообщения журнала Spring @RequestMapping?

Я пытаюсь десериализовать объект JSON, поступающий из пользовательского интерфейса Javascript, но я продолжаю получать ошибку 400 — «Запрос, отправленный клиентом, был синтаксически неправильным». Обратите внимание: я знаю, что служба REST работает, потому что я могу успешно запустить службу, если жестко закодирую JSON, но теперь я пытаюсь сгенерировать JSON из реального объекта JS.

Генерирует ли Spring сообщения журнала, которые могут помочь в этом? Если да, то как мне это настроить?


person Mr Smith    schedule 17.11.2015    source источник
comment
я думаю, вы должны исправить свой json. используйте онлайн-редактор json: jsonlintpro   -  person Kumaresan Perumal    schedule 17.11.2015
comment
Вы можете добавить фильтр сервлета, который печатает запрос, с Spring вы можете основывать его на docs.spring.io/spring/docs/current/javadoc-api/org/ См. stackoverflow.com/q/12371168/995891 например   -  person zapl    schedule 17.11.2015
comment
Можете ли вы опубликовать JSON и код, который его обрабатывает? Как мы можем сказать, что не так, ничего не видя?   -  person minion    schedule 17.11.2015
comment
Я обнаружил проблему, случай был неправильным в одном свойстве класса. но было бы неплохо логировать сообщения от @RequestMapping. Лучше всего проверить Fiddler (или другую HTTP-утилиту)?   -  person Mr Smith    schedule 17.11.2015
comment
Скрипач или что-то похожее — это то, что вы обязательно должны иметь в своем наборе инструментов. С точки зрения удобства использования намного лучше, чем, например, ведение журнала.   -  person zapl    schedule 17.11.2015


Ответы (1)


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

import javax.servlet.Filter;
...

@Configuration / @SpringBootApplication
class Something {

    @Bean
    public Filter loggingFilter(){
        return new AbstractRequestLoggingFilter() {
            private final Logger log = LoggerFactory
                    .getLogger(Something.class);

            {
                setIncludeClientInfo(true);
                setIncludeQueryString(true);
                setIncludePayload(true);
            }

            @Override
            protected void beforeRequest(HttpServletRequest request, String message) {
                // not needed
            }

            @Override
            protected void afterRequest(HttpServletRequest request, String message) {
                log.info(message);
            }
        };
    }

получается что-то похожее на

{timestamp and such} : After request [uri=/v1/thing/1007?null;client=127.0.0.1;payload=  {
    "name": "test7"
  ]

с участием

   {
        "name": "test7"

будучи уродливым телом. Это не самый приятный из фильтров, поскольку он пропускает полезную информацию, такую ​​как метод http (POST, GET, ..), время, необходимое для запроса, ответа,... Но если вы посмотрите на его источник, вы можете легко напишите более красивый, который соответствует вашим потребностям. Тем более, что ContentCachingRequestWrapper и ContentCachingResponseWrapper позволяют очень легко получить копию запроса и ответа.

Помимо фильтров сервлета вы также можете добавить HandlerInterceptor, например https://stackoverflow.com/a/28022330. Там у вас есть доступ к SpringMVC конкретные детали, но вы не можете получить доступ к содержимому запросов и ответов без их использования (сравните https://stackoverflow.com/a/2171633 )

person zapl    schedule 17.11.2015