如何在Spring Boot启动时日志输出所有已注册请求映射?
回答
要实现这个需求很简单,核心是利用Spring MVC的RequestMappingHandlerMapping组件——它会收集所有@Controller和@RequestMapping(包括@GetMapping、@PostMapping等衍生注解)定义的请求映射信息。再结合Spring Boot的启动事件或运行器,就能在应用完全就绪后打印这些内容。下面是两种常用的实现方式:
方法一:通过ApplicationListener监听启动完成事件
创建一个Spring组件,监听ApplicationReadyEvent事件(这个事件会在应用完全启动、可以处理请求时触发):
package com.example.demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ApplicationReadyEvent; import org.springframework.stereotype.Component; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import java.util.Map; @Component public class RequestMappingLogger implements ApplicationListener<ApplicationReadyEvent> { private static final Logger logger = LoggerFactory.getLogger(RequestMappingLogger.class); private final RequestMappingHandlerMapping requestMappingHandlerMapping; // 构造函数注入RequestMappingHandlerMapping public RequestMappingLogger(RequestMappingHandlerMapping requestMappingHandlerMapping) { this.requestMappingHandlerMapping = requestMappingHandlerMapping; } @Override public void onApplicationEvent(ApplicationReadyEvent event) { logger.info("=== 已注册的请求映射列表 ==="); // 获取所有请求映射条目:key是请求映射的规则信息,value是对应的处理方法 Map<String, Object> handlerMethods = requestMappingHandlerMapping.getHandlerMethods(); handlerMethods.forEach((mappingInfo, handlerMethod) -> { logger.info("请求映射: {}, 处理方法: {}", mappingInfo, handlerMethod); }); } }
方法二:使用ApplicationRunner执行启动后逻辑
ApplicationRunner是Spring Boot提供的接口,实现它的类会在应用启动完成后自动执行run方法:
package com.example.demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import java.util.Map; @Component public class RequestMappingPrinter implements ApplicationRunner { private static final Logger logger = LoggerFactory.getLogger(RequestMappingPrinter.class); private final RequestMappingHandlerMapping requestMappingHandlerMapping; public RequestMappingPrinter(RequestMappingHandlerMapping requestMappingHandlerMapping) { this.requestMappingHandlerMapping = requestMappingHandlerMapping; } @Override public void run(org.springframework.boot.ApplicationArguments args) throws Exception { logger.info("=== 已注册的请求映射列表 ==="); Map<String, Object> handlerMethods = requestMappingHandlerMapping.getHandlerMethods(); handlerMethods.forEach((mapping, method) -> { logger.info("请求映射: {}, 处理方法: {}", mapping, method); }); } }
关键说明
- 两种方法都会在应用完全启动就绪后执行,确保所有控制器的请求映射都已经被注册,不会遗漏任何接口。
- 日志级别用
INFO就足够,这样你能在控制台或日志文件里清晰看到这些映射信息。 - 输出的
mappingInfo会包含请求路径、请求方法(GET/POST等)等详细规则,handlerMethod会显示对应的控制器方法全限定名。
启动应用后,你会在日志中看到类似这样的输出:
=== 已注册的请求映射列表 === 请求映射: {[/hello],methods=[GET]}, 处理方法: public java.lang.String com.example.demo.HelloController.hello()
内容的提问来源于stack exchange,提问作者user109447
相关产品推荐
相关产品推荐

