Spring Boot MockMvc POST请求无法进入真实Controller方法问题
从你提供的代码和日志来看,测试请求无法进入Controller方法的核心原因是请求路径不匹配,Spring找不到对应的映射路由。我来一步步帮你梳理:
1. 先看日志和测试代码的路径矛盾
日志里显示实际请求的URI是/server/getTransaction/123,但你的测试代码里写的请求路径是/nfp-server/getTransaction/{transactionUuid}——这两个前缀明显不一样,说明要么是你的Controller类有统一的路径前缀,要么是测试代码里的路径写错了。
2. 检查Controller类的级别路径注解
你的方法上只加了方法级的@PostMapping("/getTransaction/{transactionUuid}"),如果Controller类本身还有类级别的@RequestMapping注解,比如:
@RequestMapping("/server") public class TransactionController { // 你的getTransaction方法 }
那这个Controller下所有方法的完整路径都会带上/server前缀,而你测试里用的/nfp-server就完全不匹配,自然找不到对应的方法。
3. 修复步骤
方案一:修正测试代码的路径
把测试里的请求路径改成和Controller实际映射一致的前缀,比如如果Controller类前缀是/server,测试代码就改成:
mockMvc.perform(post("/server/getTransaction/{transactionUuid}", "123")) .andDo(print());
方案二:打印所有请求映射确认路径
如果你不确定Controller的完整映射路径,可以在测试类里注入RequestMappingHandlerMapping,打印所有已注册的请求映射:
@Autowired private RequestMappingHandlerMapping handlerMapping; @Test public void printAllRequestMappings() { handlerMapping.getHandlerMethods().forEach((requestMappingInfo, handlerMethod) -> { System.out.println("完整请求路径:" + requestMappingInfo.getPatternsCondition()); System.out.println("对应方法:" + handlerMethod.getMethod().getName()); }); }
运行这个测试,就能看到你的getTransaction方法对应的完整请求路径,然后让测试里的路径和它完全一致。
4. 额外确认点
你的Controller方法用的是POST请求,测试里也用了mockMvc.perform(post(...)),这部分请求方法是匹配的,不用调整。
内容的提问来源于stack exchange,提问作者ip696

