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

Spring 5中ExceptionHandlerExceptionResolver始终返回200响应码问题

Spring 5.0.5升级后JUnit测试405变200的排查方案

嘿,我之前升级Spring版本时也遇到过类似的MockMvc测试异常问题,咱们一步步拆解分析:

核心问题分析

原本预期返回405 Method Not Allowed,结果拿到200 OK,说明服务器认为你的请求是合法的——要么是请求匹配到了意想不到的控制器方法,要么是Spring 5的默认请求处理逻辑和4.2不一样了。

常见原因及解决方法

1. MockMvc的OPTIONS请求自动处理导致的误判

Spring 5开始,MockMvc的standaloneSetup默认启用了dispatchOptionsRequest(自动处理OPTIONS请求),如果你的测试用例刚好是验证OPTIONS请求的405,就会被自动处理返回200。

解决方法:在MockMvc配置中禁用这个自动处理:

mockMvc = MockMvcBuilders.standaloneSetup(yourController)
    .setDispatchOptionsRequest(false) // 关闭OPTIONS自动处理
    .build();

2. 控制器@RequestMapping的方法匹配逻辑变化

检查你的控制器方法是否明确指定了method属性(比如@RequestMapping(method = RequestMethod.GET)):

  • 如果在Spring 4.2中你依赖了某种隐式的方法匹配规则,Spring 5可能收紧了匹配逻辑,导致原本不匹配的请求现在被匹配到了。
  • 另外,Spring 5对@GetMapping/@PostMapping等组合注解的解析更严格,确认你没有混用注解导致的匹配异常。

3. 全局异常处理器拦截了405错误

如果你的项目中有@ControllerAdvice或者全局异常处理器,检查是否意外捕获了HttpRequestMethodNotSupportedException(就是触发405的异常),并错误地返回了200状态码。

比如下面这种错误的处理逻辑就会导致问题:

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    @ResponseStatus(HttpStatus.OK) // 这里应该是HttpStatus.METHOD_NOT_ALLOWED
    public String handleMethodNotAllowed() {
        return "error";
    }
}

4. 内容协商(Content Negotiation)策略变化

Spring 5调整了默认的内容协商规则,如果你的测试请求带有Accept头,或者控制器方法使用了produces属性,可能导致请求被匹配到了其他兼容的控制器方法,从而返回200。

可以在测试中去掉不必要的Accept头,或者显式指定要匹配的媒体类型来验证:

mockMvc.perform(post("/api/your-path")
        .accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isMethodNotAllowed());

快速验证步骤

  1. 先简化测试用例:直接发送一个明确不匹配控制器方法的HTTP请求(比如POST到只有GET的接口),排除其他干扰。
  2. 打印请求的详细日志:在MockMvc中添加log().all(),查看请求的完整信息,确认是否有意外的请求头或参数导致匹配异常:
mockMvc.perform(post("/api/your-path"))
        .andDo(log().all())
        .andExpect(status().isMethodNotAllowed());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:44:54