如何调试Spring MVC url映射?

Sle*_*led 23 java spring spring-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" );
      }
 }
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用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'
Run Code Online (Sandbox Code Playgroud)

但是,当我https://localhost/docs/pupil/classes/ACADEMIC在浏览器中输入URL 时出现404错误,我在控制台中看不到任何打印出来的内容.我替换了抛出异常的打印输出代码,它似乎也没有被抛出.同事建议应该有一种方法来查看URL解析是如何完成的,但谷歌搜索似乎没有出现任何问题.

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

Pat*_*ick 15

对于这样我觉得最好的"入口点"开始调试问题是方法getHandler(HttpServletRequest request)DispatcherServlet.

在此方法中,HandlerMapping如果负责处理您的特定请求,则会检查每个已配置的内容.如果您的请求到目前为止,您可以确定它是spring上下文中的配置问题.

注意该类型的处理程序RequestMappingHandlerMapping(或者DefaultAnnotationHandlerMapping,如果您使用的是旧版本的Spring),这些通常HandlerMapping由基于注释的Controller配置使用.

在另一种情况下,请确保DispatcherServlet过滤您的请求没有"在前面" (如您的情况)

  • 从这个建议开始,但亲自找到[`doDispatch(HttpServletRequest,HttpServletResponse)`](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html# doDispatch-javax.servlet.http.HttpServletRequest-javax.servlet.http.HttpServletResponse-)作为更好的起点. (3认同)

Cap*_*rn1 7

Daniele Torino的帖子通过提请DEBUG和DEBUG来使我走上正确的道路。除了日志框架之外,我认为使用哪个版本的Spring也很重要。在我们最近搬出的Spring 3中,我认为DEBUG就足够了。但是,在春季5中,没有列出实际的映射。我记得(在Spring 3.x中)我过去只是通过设置来查看映射

<logger name="org.springframework.web" level="DEBUG" />
Run Code Online (Sandbox Code Playgroud)

,但现在(在Spring 5.x中)仅列出映射数。

DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - 14 mappings in 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping'
Run Code Online (Sandbox Code Playgroud)

在春季5中,直到我添加了才记录实际的映射

<logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="TRACE" /> 
Run Code Online (Sandbox Code Playgroud)

到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]}}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ino 6

确切的答案取决于您使用的日志记录框架.

如果将日志级别设置为org.springframework.webto DEBUGTRACEspring mvc将记录更详细的信息.


Wit*_*rba 6

Spring 4和Spring BOOT中 -帮助我在application.properties中启用DEBUG日志记录的是什么。为此,只需添加:

logging.level.org.springframework.web =调试

更新

对于最新的Spring引导中的Debug模式,请添加:

debug=true
Run Code Online (Sandbox Code Playgroud)

到您的application.properties文件中


Don*_*Liu 5

感谢 Bartosz Bilicki Actuator 的提示,这真的很好。我将以下配置添加到我的 application.yml 中。

management:
  server:
    port: 9001
    address: 127.0.0.1
  endpoints:
    enabled-by-default: true
    web:
      exposure:
        include: '*'
Run Code Online (Sandbox Code Playgroud)

然后我打开http://localhost:9001/actuator/mappings,仅此而已。