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

@ResponseBody注解在控制器无返回值方法中如何绑定数据?

问题解答

首先要明确:这个场景里的@ResponseBody注解实际上没有发挥任何作用,数据能写入响应完全是因为代码里直接操作了HttpServletResponse对象。

核心原因

Spring MVC对控制器方法返回值的处理逻辑是:

  • 如果方法返回非void类型,@ResponseBody会触发Spring的消息转换器(比如Jackson),把返回值序列化成对应格式(JSON/XML等)并写入响应体。
  • 如果方法返回void类型,Spring MVC默认认为开发者已经手动完成了响应内容的写入工作,不会再执行@ResponseBody对应的消息转换流程——不管你加不加这个注解,结果都是一样的。

代码的实际执行流程

你贴的代码中,真正把数据写入响应的是JsonMapper的WritecInJson方法:

  1. 方法内部创建了MappingJackson2HttpMessageConverter(这也是Spring处理JSON响应默认使用的转换器)
  2. 通过ServletServerHttpResponse把传入的HttpServletResponse包装起来
  3. 调用转换器的write方法,直接把Map数据序列化成JSON并写入响应流

换句话说,整个过程完全绕开了@ResponseBody的逻辑,是开发者手动完成了响应的写入操作。即使你把控制器方法上的@ResponseBody删掉,这段代码的功能也不会有任何变化。

补充说明

这种写法属于比较旧的Spring MVC用法,在新版本中更推荐直接返回对象并配合@ResponseBody(或者用@RestController替代@Controller+@ResponseBody),让Spring自动处理消息转换和响应写入,避免手动操作HttpServletResponse带来的冗余代码和潜在问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:52:20