自定义Spring Boot starter编程定义RequestMapping后访问报404如何解决
问题根因与解决方案
你自定义的RequestMappingHandlerMapping未被正确纳入Spring MVC请求处理链路,也未完成必要的初始化流程,导致注册的路由无法被匹配,因此返回404响应,需要做以下修改:
必要配置修改
- 调整HandlerMapping优先级
Spring MVC默认自带的RequestMappingHandlerMapping优先级为0,请求会按优先级顺序依次匹配HandlerMapping,优先级低的实例不会被触发。需要给自定义HandlerMapping设置更高优先级(order值越小优先级越高),调用handlerMapping.setOrder(-100);即可。 - 手动执行初始化流程
直接new生成的RequestMappingHandlerMapping不会自动触发Spring的初始化回调,你需要在注册完所有映射后手动调用afterPropertiesSet()方法完成路径匹配、参数解析等核心策略的初始化。 - 对齐全局路径匹配规则
如果项目配置了自定义的路径匹配规则(比如启用PathPatternParser、配置了上下文路径、URL前缀等),需要手动给自定义HandlerMapping设置和全局一致的匹配策略,避免路径匹配失败。
修正后的代码示例
@Bean @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) public RequestMappingHandlerMapping customRoutes(ApplicationContext context, @Lazy PathPatternParser pathPatternParser) { var handlerMapping = new RequestMappingHandlerMapping(); // 设置高优先级,优先匹配自定义路由 handlerMapping.setOrder(-100); // 对齐全局路径匹配策略 handlerMapping.setPatternParser(pathPatternParser); findTargetBeans(context).forEach((name, bean) -> { var getMapping = RequestMappingInfo .paths("/" + name) .methods(RequestMethod.GET) .produces(MediaType.APPLICATION_JSON_VALUE) .build(); handlerMapping.registerMapping(getMapping, createHandler(), getHandlerMethod()); }); // 手动触发初始化,完成映射注册 handlerMapping.afterPropertiesSet(); return handlerMapping; }
可选排查点
如果修改后仍返回404,可以开启Spring MVC的debug日志,搜索你注册的路径,确认路径是否被成功加载到HandlerMapping的映射列表中,同时检查请求方法、请求头Accept属性是否和你定义的methods、produces配置匹配。
内容的提问来源于stack exchange,提问作者Psycho Punch
相关产品推荐
相关产品推荐

