如何在Spring中使用@RestController而不隐式添加@ResponseBody?
解决Spring中返回Thymeleaf模板却显示文本的问题
嘿,我来帮你搞定这个问题!你遇到的核心矛盾就是**@RestController**的特性:它相当于@Controller + @ResponseBody的组合,会把所有方法的返回值直接序列化为响应体(比如字符串就直接输出文本),而不是当作视图名去匹配Thymeleaf模板。
针对这个问题,有两种清晰的解决方案:
方案一:直接改用@Controller(最推荐)
这是最直接的做法,因为@Controller不会自动给方法添加@ResponseBody注解。当你返回字符串时,Spring MVC会自动把它当作视图名称,去查找对应的Thymeleaf模板(比如返回"test"就会找templates/test.html)。
修改后的控制器代码如下:
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class MainController { @GetMapping("/test") public String test() { return "test"; } }
方案二:混合使用(适合同时需要API和页面跳转的场景)
如果你的控制器里既有需要返回JSON/文本的API接口,又有需要跳转页面的方法,可以保留@Controller,然后在API方法上单独添加@ResponseBody注解,而页面跳转的方法不加,这样就能区分两种行为:
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { // 跳转Thymeleaf模板 @GetMapping("/test") public String test() { return "test"; } // 返回JSON/文本的API @GetMapping("/api/hello") @ResponseBody public String helloApi() { return "Hello from API"; } }
简单总结:如果你的控制器主要负责页面跳转,直接用@Controller就对了;如果需要同时处理API和页面,就用@Controller配合@ResponseBody来区分方法的行为~
内容的提问来源于stack exchange,提问作者janssen-dev
相关产品推荐
相关产品推荐

