为什么@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
相关产品推荐
相关产品推荐

