如何调试弹簧MVC网址映射?

2022-09-01 02:00:24

我正在使用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时,我收到404错误,并且在控制台中看不到任何打印出来的内容。我替换了只抛出异常的打印代码,它似乎也没有被抛出。一位同事建议应该有一种方法来查看URL解析是如何完成的,但Google搜索似乎没有发现任何东西。https://localhost/docs/pupil/classes/ACADEMIC

关于如何调试这个的任何建议?


答案 1

对于这样的问题,我觉得开始调试的最佳“切入点”是.getHandler(HttpServletRequest request)DispatcherServlet

在此方法中,如果每个配置负责处理您的特定请求,则会对其进行检查。如果您的请求到目前为止,您可以非常确定这是Spring上下文中的配置问题。HandlerMapping

请注意该类型的处理程序(或者,如果您使用的是旧版本的Spring),这些处理程序通常是基于注释的控制器配置所使用的。RequestMappingHandlerMappingDefaultAnnotationHandlerMappingHandlerMapping

在另一种情况下,请确保过滤请求的“前面”没有任何内容(就像您的情况一样)DispatcherServlet


答案 2

Daniele Torino的帖子让我走上了正确的道路,除了DEBUG之外,还提到了TRACE。除了日志记录框架之外,我认为使用哪个版本的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]}}

推荐