Подтвердить что ты не робот

Как отлаживать Spring сопоставление URL MVC?

Я использую 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, похоже, ничего не активировал.

Любые предложения по отладке этого?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Почта Даниэля Турина подтолкнула меня к правильному пути, упомянув TRACE в дополнение к DEBUG. В дополнение к каркасу ведения журнала, я думаю, что имеет значение, какую версию Spring вы используете. Spring 3, с которой мы недавно переехали, я думаю, что DEBUG было достаточно. Однако spring 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]}}

Ответ 3

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

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

Ответ 4

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

logging.level.org.springframework.web = ОТЛАДКА

обновление

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

debug=true

в ваш файл application.properties

Ответ 5

Вы можете добавить строку для 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":["[email protected]"],"cc":[],"subject":"Test subject","body":null,"replacement":{"TITLE":"Test email","SERVER_NAME":"Whatever"},"attachments":{},"html":true}]

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

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

server.tomcat.accesslog.enabled = true

Ответ 6

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

https://localhost:8443//docs/ученик/классы/ACADEMIC

Ответ 7

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

Подробнее о конечных точках см. http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html.

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

Конечная точка

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

Ответ 8

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

Ответ 9

Спасибо за подсказки Bartosz Bilicki Actuator, это действительно здорово. Я добавляю следующие конфигурации в мой applicationaton.yml.

management:
  server:
    port: 9001
    address: 127.0.0.1
  endpoints:
    enabled-by-default: true
    web:
      exposure:
        include: '*'

А потом я открываю http://localhost:9001/actuator/mappings, вот и все.

Ответ 10

В вашем URL-адресе (https://localhost/docs/pupil/classes/ACADEMIC) отсутствует имя приложения, которое должно быть URL (https://localhost/appName/docs/pupil/classes/ACADEMIC)