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

Spring测试类中接口请求返回404错误排查(已携带Bearer Token且Postman请求正常)

解决MockMvc测试返回404但Postman正常的问题

从你的测试代码和控制台输出来看,核心问题是请求路径没有正确映射到控制器(控制台里Handler: Type = null已经明确这一点),结合Postman能正常访问的情况,我给你梳理几个关键排查和解决方向:

1. 去掉MockMvc请求中的完整URL前缀

MockMvc是在Spring的模拟Servlet环境中发起请求,不需要指定http://localhost:8080这类完整主机地址,只需要使用相对路径即可。你当前的请求带了完整域名,会导致MockMvc无法正确匹配控制器的映射规则。

修改测试代码中的请求路径:

// 去掉http://localhost:8080,保留上下文路径+接口路径
.perform(get("/CashLetterAPI/rest/moneda/findById/{id}", 1)
        .header("Authorization", "Bearer eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiJzb2Z0dGVrSldUIiwic3ViIjoiZXhhbXBsZSIsImlhdCI6MTYxOTcwNTE0MiwiZXhwIjoxNjE5NzExMTQyfQ.e82DP4xfm-sPPHmxEv5tzGSwnAVCnQeP61DSSWtZZlM45wT7tFNQSMakjy_FptYBwrN28CFlpt1dDuT6u_mjVA"))

如果你的测试环境没有配置server.servlet.context-path(或者配置与开发环境不同),可以直接去掉/CashLetterAPI前缀:

.perform(get("/rest/moneda/findById/{id}", 1)
        .header("Authorization", "Bearer ..."))

2. 验证控制器的映射路径是否完全匹配

检查你的MonedaRestController类和方法的注解:

  • 控制器类上的@RequestMapping是否为/rest/moneda?
  • findById方法上的@GetMapping是否为/findById/{id}?
    要确保测试中的路径和Postman里的请求路径完全一致(包括大小写、下划线等细节),毕竟MockMvc的路径匹配是严格的。

3. 确认测试环境的Token配置一致性

虽然Postman里Token有效,但测试环境的JWT配置可能和开发环境不一致:

  • 查看config.properties中的JWT密钥、过期时间等配置是否和生成Token的环境一致。
  • 注意:如果授权过滤器逻辑错误(比如验证失败返回404而非401)也可能导致问题,但从当前控制台输出看,请求根本没找到控制器,所以这个可能性较低。

4. 检查测试数据加载情况

你用了@Sql("/data.sql"),要确保脚本里确实插入了id=1的Moneda数据。不过如果是数据不存在,接口返回404时控制台会显示Handler存在,而非Type = null,所以这不是当前核心问题。

修改后的完整测试代码示例:

@Test
void testGetMonedaPorId() throws UnsupportedEncodingException, Exception {
    String response = mockMvc
            .perform(get("/CashLetterAPI/rest/moneda/findById/{id}", 1)
                    .header("Authorization", "Bearer eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiJzb2Z0dGVrSldUIiwic3ViIjoiZXhhbXBsZSIsImlhdCI6MTYxOTcwNTE0MiwiZXhwIjoxNjE5NzExMTQyfQ.e82DP4xfm-sPPHmxEv5tzGSwnAVCnQeP61DSSWtZZlM45wT7tFNQSMakjy_FptYBwrN28CFlpt1dDuT6u_mjVA"))
            .andExpect(status().isOk())
            .andReturn().getResponse().getContentAsString();
    logger.info("response: " + response);
    // assertEquals(1L, monedaService.getMonedaPorId(1L).getId());
}

优先尝试修改路径,这是最可能解决问题的方案。如果还是不行,可以开启Spring的调试日志(比如设置logging.level.org.springframework.web=DEBUG),查看请求的映射过程,进一步定位问题。

内容的提问来源于stack exchange,提问作者melolo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:57:32