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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:25:56