如何调试Spring MVC url映射?

时间:2011-03-28 15:39:50

标签: 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" );
      }
 }

我正在尝试使用Spring URI template syntax,我知道它已被映射,因为在控制台中我看到了:

 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 search似乎没有出现任何问题。

有关如何调试此内容的任何建议吗?

11 个答案:

答案 0 :(得分:10)

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

在此方法中,如果负责处理您的特定请求,则会检查每个已配置的HandlerMapping。如果您的请求到目前为止,您可以确定它是Spring环境中的配置问题。

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

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

答案 1 :(得分:6)

确切的答案取决于您使用的日志框架。

如果您将importing的日志级别设置为org.springframework.webDEBUG,则mvc将记录更详细的信息。

答案 2 :(得分:6)

Spring 4和Spring BOOT - 帮助我的是在application.properties中启用DEBUG日志记录。要做到这一点 - 只需添加:

logging.level.org.springframework.web = DEBUG

<强>更新

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

debug=true

进入你的application.properties文件

答案 3 :(得分:2)

Daniele Torino的帖子除了提及DEBUG之外,还提到了TRACE,这使我走了正确的道路。除了日志框架之外,我认为使用哪个版本的Spring也很重要。在我们最近搬出的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'

在春季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]}}

答案 4 :(得分:1)

感谢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,就这样。

答案 5 :(得分:0)

如果您在apache上的https站点上托管,该站点重定向到后端,则缺少appContext。它应该像

https://localhost:8443/ /文档/瞳孔/类/学术

答案 6 :(得分:0)

如果将Spring Boot与Actuator一起使用,映射端点将显示所有@RequestMapping路径的整理列表。

有关端点的详细信息,请参阅http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html

有关如何包含Actuator模块的教程,请参阅https://spring.io/guides/gs/actuator-service/。对于Gradle,您只需要compile("org.springframework.boot:spring-boot-starter-actuator")

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

答案 7 :(得分:0)

您可以在日志记录配置中添加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的access.log。您可以在application.properties中启用它,如下所示:

server.tomcat.accesslog.enabled = true

答案 8 :(得分:0)

我认为您可以在Chrom控制台/网络面板上观看此内容,与您配置的网址进行比较

答案 9 :(得分:0)

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

Intellij View

先决条件

  • 使用Spring Boot
  • 按照@Bartosz所述激活映射执行器:
  1. 包含依赖项

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
  2. 属性:

    management.endpoints.enabled-by-default=true
    management.endpoints.web.exposure.include=mappings
    

答案 10 :(得分:-2)

你的网址(https:// localhost / docs / pupil / classes / ACADEMIC)缺少appName它应该是URL(https:// localhost / appName / docs / pupil / classes / ACADEMIC)