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

为什么@RestController下GetMapping无法返回HTML页面,@Controller却可以?

@Controller与@RestController差异说明

两个注解的核心区别

你之前看到的“两个注解等价”的说法存在前提遗漏,二者实际作用完全不同:

  • @Controller是Spring MVC传统页面控制器注解:类中方法返回的字符串默认会交给视图解析器处理,结合你引入的Thymeleaf模板引擎,会自动拼接前缀后缀找到templates目录下对应名称的HTML模板,渲染成完整页面后返回给浏览器,这就是你用@Controller时能正常看到表单页面的原因。
  • @RestController是组合注解,等价于@Controller + @ResponseBody:类中所有方法的返回值默认直接写入HTTP响应体,不会走视图解析流程。你方法返回的字符串"greeting"会被直接当成响应内容返回,不会解析对应模板,所以页面只会显示纯文本greeting。

等价场景说明

唯一的等价场景是:当@Controller注解的类中,所有方法都单独添加了@ResponseBody注解时,功能和@RestController完全一致,这也是你之前看到的等价说法的适用前提。

场景选型建议

  • 如果你需要做页面渲染、返回HTML视图的场景,统一用@Controller即可
  • 如果你是开发数据接口(比如返回JSON格式的接口响应),才需要用到@RestController

补充测试方案(非必要)

如果你非要在@RestController下返回页面,可以将返回值改为ModelAndView对象,跳过@ResponseBody的默认逻辑,示例如下:

@GetMapping("/greeting")
public ModelAndView greetingForm(){
    ModelAndView mav = new ModelAndView("greeting");
    mav.addObject("greeting",new CharacteristicsEntity());
    return mav;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:54:01