You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:52:20