Как отладить сопоставление URL Spring MVC? - PullRequest
21 голосов
/ 28 марта 2011

Я использую Spring MVC 3 и у меня проблема с отображением URL.У меня есть метод

 @Controller
 public class DocumentController {
      @RequestMapping( value="/docs/pupil/classes/{courseCategoryType}", method=RequestMethod.GET )
      public ModelAndView listClassesForPupil( @PathVariable("courseCategoryType") final String courseCategoryType ){
            System.err.print( "\n\n\n\t\t--- XXXXX ---\n\n\n" );
      }
 }

Я пытаюсь использовать синтаксис шаблона Spring URI , и я знаю, что отображается, потому что в консоли я вижу:

 11:22:12,108  INFO DefaultAnnotationHandlerMapping:411 - Mapped URL path [/docs/pupil/classes/{courseCategoryType}] onto handler 'documentController'
 11:22:12,108  INFO DefaultAnnotationHandlerMapping:411 - Mapped URL path [/docs/pupil/classes/{courseCategoryType}.*] onto handler 'documentController'
 11:22:12,108  INFO DefaultAnnotationHandlerMapping:411 - Mapped URL path [/docs/pupil/classes/{courseCategoryType}/] onto handler 'documentController'

Однако, когда я ввожу URL https://localhost/docs/pupil/classes/ACADEMIC в браузере, я получаю сообщение об ошибке 404 и не вижу ничего распечатанного в консоли.Я заменил распечатанный код, который просто выбрасывает исключение, и он, похоже, тоже не выдается.Коллега порекомендовал, что должен быть способ просмотра разрешения URL-адреса, но поиск в Google , похоже, ничего не дал.

Есть предложения о том, как это отладить?

Ответы [ 9 ]

11 голосов
/ 16 февраля 2017

Для подобных проблем я чувствую, что лучшей «точкой входа» для начала отладки является метод getHandler(HttpServletRequest request) из DispatcherServlet.

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

Следите за обработчиками типа RequestMappingHandlerMapping (или DefaultAnnotationHandlerMapping, если вы используете более старую версию Spring), обычно это HandlerMapping, используемые конфигурацией контроллера на основе аннотаций.

В другом случае убедитесь, что нет ничего "впереди" DispatcherServlet, фильтрующего ваши запросы (как в вашем случае)

6 голосов
/ 17 марта 2017

В Spring 4 и Spring BOOT - мне помогло включение регистрации отладки в application.properties.Для этого просто добавьте:

logging.level.org.springframework.web = DEBUG

update

Для режима отладки при последней загрузке Springдобавьте:

debug=true

в файл application.properties

6 голосов
/ 31 января 2017

Точный ответ на этот вопрос зависит от используемой вами схемы ведения журналов.

Если вы установите уровень журнала для org.springframework.web на DEBUG или TRACE, то пружинный mvc будет регистрировать более подробную информацию.

3 голосов
/ 11 февраля 2019

Пост Даниэля Торино помог мне выбрать правильный путь, упомянув TRACE в дополнение к DEBUG.В дополнение к каркасу ведения журнала, я думаю, что имеет значение, какую версию Spring вы используете.Весной 3, с которой мы недавно переехали, я думаю, что DEBUG было достаточно.Однако весной 5 фактические сопоставления не перечислены.Я вспоминаю, что (в Spring 3.x) раньше я видел отображения, просто устанавливая

<logger name="org.springframework.web" level="DEBUG" />

, но теперь (в Spring 5.x), который отображает только количество отображений.

DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - 14 mappings in 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping'

В Spring 5 фактические сопоставления не регистрировались, пока я не добавил

<logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" /> 

в файл log.properties.(Я рекомендую использовать TRACE экономно.) После этого вывод журнала включает несколько строк, таких как:

TRACE o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped 1 handler method(s) for class com.yourcompany.YourClass: {public org.springframework.web.servlet.ModelAndView com.yourcompany.YourClass.someMethod(<your parameters and models here>,javax.servlet.http.HttpServletRequest)={[/your-request-mapping-url],methods=[GET]}}
1 голос
/ 31 января 2017

Вы можете добавить строку для CommonsRequestLoggingFilter в своей конфигурации регистрации (пример log4j ниже):

<logger name="org.springframework.web.filter.CommonsRequestLoggingFilter">
    <level value="DEBUG"/>
</logger>

Она напечатает ваш URI до и после обработки, например:

org.springframework.web.filter.CommonsRequestLoggingFilter - Before request [uri=/sendMail/D0000/14/en/?null]
org.springframework.web.filter.CommonsRequestLoggingFilter - After request [uri=/sendMail/D0000/14/en/?null;payload={"to":["somebody@somewhere"],"cc":[],"subject":"Test subject","body":null,"replacement":{"TITLE":"Test email","SERVER_NAME":"Whatever"},"attachments":{},"html":true}]

Это действительно полезно, хотя и не показывает запросы на несуществующие ресурсы (например, 404, которые вы получаете).

Еще один вариант получения всех запросов, есливы используете Spring Boot, Tomcat's access.log.Вы можете включить его в вашем application.properties следующим образом:

server.tomcat.accesslog.enabled = true
0 голосов
/ 23 февраля 2017

Я думаю, вы можете посмотреть это с консоли / сетевой панели Chrom, сравните с URL-адресом, который вы настроили

0 голосов
/ 31 января 2017

Если вы используете Spring Boot с Actuator, конечная точка сопоставления покажет объединенный список всех путей @RequestMapping.

См. http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html для более подробной информации о конечных точках.

См. https://spring.io/guides/gs/actuator-service/, чтобы узнать, как включить модуль привода. Для Gradle вам просто нужно compile("org.springframework.boot:spring-boot-starter-actuator")

beans конечная точка также полезна. Он покажет все загруженные бобы. Возможной причиной отсутствия конечной точки HTTP является тот факт, что соответствующий компонент (отображение) не был загружен (поскольку он не находится на пути componentScan).

0 голосов
/ 31 января 2017

если вы размещаете на сайте https на apache, который перенаправляет на бэкэнд, отсутствует appContext.это должно быть что-то вроде

https://localhost:8443//docs/pupil/classes/ACADEMIC

0 голосов
/ 15 октября 2012

Ваш URL (https://localhost/docs/pupil/classes/ACADEMIC) отсутствует appName, это должен быть URL (https://localhost/appName/docs/pupil/classes/ACADEMIC)

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