- 创建一个配置类,实现
WebMvcConfigurer
接口,并重写addInterceptors
方法来注册一个自定义的RequestMappingHandlerMapping
。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;/*** @date 2024/4/12 14:52*/
@Configuration
public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate ControllerUrlPrintingInterceptor controllerUrlPrintingInterceptor;@Overridepublic void configurePathMatch(PathMatchConfigurer configurer) {}@Overridepublic void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}@Overridepublic void configureAsyncSupport(AsyncSupportConfigurer configurer) {}@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}@Overridepublic void addFormatters(FormatterRegistry registry) {}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(controllerUrlPrintingInterceptor).addPathPatterns("/**");}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {}@Overridepublic void addCorsMappings(CorsRegistry registry) {}@Overridepublic void addViewControllers(ViewControllerRegistry registry) {}@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {}@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {}@Overridepublic void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {}@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}@Overridepublic void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {}@Overridepublic void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {}@Overridepublic Validator getValidator() {return null;}@Overridepublic MessageCodesResolver getMessageCodesResolver() {return null;}
}
2. 创建一个拦截器类ControllerUrlPrintingInterceptor
,实现HandlerInterceptor
接口,并重写preHandle
方法。
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @date 2024/4/12 14:49*/
@Component
public class ControllerUrlPrintingInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {}
}
3.在StartupControllerUrlPrinter
中,我们通过RequestMappingHandlerMapping
获取所有的URL和对应的处理器映射,然后打印出来。
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;/*** @date 2024/4/12 14:54*/
public class StartupControllerUrlPrinter implements ApplicationListener<ContextRefreshedEvent> {private final RequestMappingHandlerMapping handlerMapping;public StartupControllerUrlPrinter(RequestMappingHandlerMapping handlerMapping) {this.handlerMapping = handlerMapping;}@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {handlerMapping.getHandlerMethods().forEach((key, value) -> System.out.println(key));}
}
4.写一个配置类,将StartupControllerUrlPrinter在启动时注册
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;/*** @date 2024/4/12 14:55*/
@Configuration
public class AppConfig {@Beanpublic StartupControllerUrlPrinter startupControllerUrlPrinter(RequestMappingHandlerMapping handlerMapping) {return new StartupControllerUrlPrinter(handlerMapping);}
}
这样,当 Spring Boot 应用启动时,就会打印出所有的 Controller URL 地址,帮助你快速了解应用的路由配置。