Java 如何调试Spring MVC url映射?

Java 如何调试Spring MVC url映射?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在使用SpringMVC3,但URL映射有问题。我有办法 @Controller public class DocumentController { @RequestMapping( value="/docs/pupil/classes/{courseCategoryType}", method=RequestMethod.GET ) public ModelAndView listClassesForPupil( @PathVariable("courseCat

我正在使用SpringMVC3,但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" );
      }
 }
我正在尝试使用,我知道正在映射,因为在控制台中我看到:

 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解析是如何完成的,但A似乎没有显示任何内容


有没有关于如何调试的建议?

您的URL(https://localhost/docs/pupil/classes/ACADEMIC)缺少应为URL的appName(https://localhost/appName/docs/pupil/classes/ACADEMIC)

如果您在apache上的https站点上托管,并且该站点正在重定向到后端,则缺少appContext。应该是这样的


/文档/学生/班级/学术

这一问题的确切答案取决于您使用的日志框架


如果将
org.springframework.web
的日志级别设置为
DEBUG
TRACE
,spring mvc将记录更多详细信息。

如果将spring引导与执行器一起使用,映射端点将显示所有@RequestMapping路径的整理列表

有关端点的详细信息,请参见

有关如何包含执行器模块的教程,请参见。对于Gradle,您只需要
编译(“org.springframework.boot:springbootstarteractivator”)


bean
端点也很有用。它将显示所有加载的bean。缺少HTTP端点的可能原因是没有加载相应的bean(映射)(因为他不在componentScan路径上)

您可以在日志配置中为
commonRequestLoggingFilter
添加一行(下面的log4j示例):

它非常有用,尽管它不会显示对不存在的资源的请求(比如您得到的404)

如果使用Spring Boot,获取所有请求的另一个选项是Tomcat的
access.log
。您可以在
应用程序中启用它。属性如下所示:

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}]
server.tomcat.accesslog.enabled = true

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

在该方法中,如果负责处理您的特定请求,则会检查每个配置的
HandlerMapping
。如果您的请求完成了这一步,您可以非常确定这是spring上下文中的一个配置问题

注意类型为
RequestMappingHandlerMapping
(或
DefaultAnnotationHandlerMapping
,如果您使用的是较旧版本的Spring),这些处理程序通常是基于注释的控制器配置使用的
HandlerMapping


在另一种情况下,确保
DispatcherServlet
过滤您的请求(如您的案例)

我想您可以从Chrom控制台/网络面板上看到这一点,与您在Spring 4和Spring BOOT中配置的url相比,帮助我的是在application.properties中启用调试日志记录。为此,只需添加:

logging.level.org.springframework.web=DEBUG

更新

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

debug=true

在application.properties文件中

Daniele Torino的帖子除了调试之外还提到了跟踪,这让我找到了正确的途径。除了日志框架之外,我认为使用哪个版本的Spring也很重要。在我们最近搬离的Spring3中,我认为调试已经足够了。但是,在Spring5中,没有列出实际的映射。我记得(在Spring3.x中)我曾经只通过设置

<logger name="org.springframework.web" level="DEBUG" />
在Spring5中,直到我添加了

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

转到log.properties文件。(我建议尽量少使用跟踪。)这样,日志输出包括以下几行:

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]}}
TRACE o.s.w.s.m.m.a.RequestMappingHandlerMapping-类com.yourcompany.YourClass的映射1个处理程序方法:{public org.springframework.web.servlet.ModelAndView com.yourcompany.YourClass.someMethod(,javax.servlet.http.HttpServletRequest)={[/your请求映射url],方法=[GET]}

感谢Bartosz Bilicki的致动器提示,真是太好了。我将以下配置添加到applicaton.yml中

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

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

您可以在Intellij运行视图中很好地显示MVC映射:

先决条件

  • 使用弹簧靴
  • 按照说明启动映射执行器:
  • 包含依赖项

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    

  • 快速检查:其他控制器是否工作?您确定上下文路径、
    DispatcherServlet
    的url模式等没有问题吗?其他控制器工作正常,我们解决了这个问题(我发现前端控制器有一个过滤器,可以忽略除*.bf请求以外的所有请求)但是我认为这个问题仍然有用,因为我希望将来能够调试像这样的请求问题。许多“初学者”依赖项不包括它。从这个建议开始,但个人认为是更好的开始。从哪里开始才能真正看到哪个servlet被选中?(我对调度程序servlet没有绑定有问题)Hi@Philip Rego。我更新了最新spring引导的答案。在我的设置中,/exactor/mappings不起作用,但/mappings确实起了很大的作用。谢谢
    management:
      server:
        port: 9001
        address: 127.0.0.1
      endpoints:
        enabled-by-default: true
        web:
          exposure:
            include: '*'
    
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
    management.endpoints.enabled-by-default=true
    management.endpoints.web.exposure.include=mappings