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

自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:06:04