我正在使用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似乎没有出现任何问题。
有关如何调试此内容的任何建议吗?
答案 0 :(得分:10)
对于这样的问题,我觉得开始调试的最佳“入口点”是getHandler(HttpServletRequest request)
的方法DispatcherServlet
。
在此方法中,如果负责处理您的特定请求,则会检查每个已配置的HandlerMapping
。如果您的请求到目前为止,您可以确定它是Spring环境中的配置问题。
注意RequestMappingHandlerMapping
(或DefaultAnnotationHandlerMapping
类型的处理程序,如果您使用的是旧版本的Spring),这些通常是基于注释的Controller配置使用的HandlerMapping
。
在另一种情况下,请确保DispatcherServlet
过滤您的请求(就像您的情况一样)没有“在前面”
答案 1 :(得分:6)
确切的答案取决于您使用的日志框架。
如果您将importing
的日志级别设置为org.springframework.web
或DEBUG
,则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映射:
先决条件
包含依赖项
<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
答案 10 :(得分:-2)
你的网址(https:// localhost / docs / pupil / classes / ACADEMIC)缺少appName它应该是URL(https:// localhost / appName / docs / pupil / classes / ACADEMIC)