@ResponseBody不生效的根本原因是缺少JSON序列化支持或控制器未被扫描到;需检查jackson-databind依赖、@ComponentScan范围、MappingJackson2HttpMessageConverter配置及路径匹配等。

Spring MVC里@ResponseBody不生效,返回的是HTML或404
根本原因通常是缺少 @ResponseBody 对应的 JSON 序列化支持,或者控制器没被 Spring 扫描到。Spring Boot 默认带 jackson-databind,但传统 Spring MVC 项目常漏配 MappingJackson2HttpMessageConverter。
- 检查是否引入了
jackson-databind(不是jackson-core单独一个) - 确认
@Controller类在@ComponentScan范围内,且没有写成@RestController却又手动加了@ResponseBody - 如果用的是 XML 配置,需显式注册
MappingJackson2HttpMessageConverter到AnnotationMethodHandlerAdapter(老版本)或RequestMappingHandlerAdapter(4.0+) - 浏览器直接访问接口返回 HTML?大概率是没触发 JSON 写出逻辑——检查响应头是否含
Content-Type: application/json,没有就说明@ResponseBody没走通
@RequestMapping路径匹配失败或405 Method Not Allowed
路径和 HTTP 方法必须同时匹配,否则 Spring 会跳过该方法,甚至抛 405。很多人只盯着 URL,忽略 method 属性。
-
@RequestMapping(value = "/api/user", method = RequestMethod.GET)和@GetMapping("/api/user")等价,但后者更安全;混用@RequestMapping和@PostMapping在同一类里容易漏掉 method 限定 - 路径末尾斜杠敏感:
/user和/user/默认不等价,除非配置useTrailingSlashMatch=true(不推荐,易混淆) - 如果 Controller 类上也有
@RequestMapping("/api"),方法上的路径是相对的,拼接后才是完整路径——别手抖写成@RequestMapping("/api/user")又在类上写了@RequestMapping("/api"),结果变成/api/api/user - GET 请求参数名不匹配(比如前端传
userId,后端写@RequestParam("id"))不会报错,但值为 null,可能误判为路径问题
返回对象字段为空或时间格式不对
JSON 序列化由 Jackson 控制,默认只序列化 public 字段或 getter 方法,且对 Date、LocalDateTime 等类型不做友好处理。
- 确保实体类字段有 public getter(如
getUserName()),或加@JsonProperty("user_name")显式指定 -
java.util.Date默认序列化成时间戳,要转成字符串得加@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") -
LocalDateTime需要jackson-datatype-jsr310依赖,否则直接抛JsonMappingException - 字段为 null 时仍出现在 JSON 中?加
@JsonInclude(JsonInclude.Include.NON_NULL)到类或全局配置
Spring Boot vs 传统 Spring MVC 的关键差异点
Boot 自动装配掩盖了很多细节,切换到传统 XML 或 Java Config 时容易掉坑。
立即学习“Java免费学习笔记(深入)”;
- Boot 默认开启
@EnableWebMvc等效配置,传统项目若手动加了@EnableWebMvc,反而会关闭 Boot 的自动配置,导致 JSON 支持丢失 - Boot 的
spring.jackson.*配置项(如spring.jackson.date-format)在传统项目中无效,必须通过ObjectMapperBean 手动设置 - 传统项目里,
@RestController是@Controller + @ResponseBody的组合注解,但如果你在方法上再加@ResponseBody,不会报错,但属于冗余;而 Boot 下更常见的是直接用@RestController,省去每个方法都写 - 406 Not Acceptable 错误通常意味着客户端 Accept 头要求
application/json,但服务端没注册对应的消息转换器——这个在 Boot 里几乎不会出现,在传统项目里却高频
最常被忽略的是:返回值类型为 void 或 String 时,@ResponseBody 依然生效,但内容不会被 Jackson 处理。比如返回 "{ \"ok\": true }" 字符串,它会被原样写出,不经过序列化——这时候如果字符串里有中文乱码,问题根源在字符编码配置,而不是 Jackson。










