了解@Controller和@RestController,为什么它在@Controller上有效而在@RestController上无效

问题描述 投票:0回答:1

为什么这个 Model 东西在 @Controller 上工作但在 @RestController 上不起作用

当我尝试时

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Controller
public class ArticleController {

    @GetMapping("/articles")
    public String getArticles(Model model) {
        List<Article> articles = articleService.findAllArticles();
        model.addAttribute("articles", articles);
        return "articleList";
    }

    @GetMapping("/article/{id}")
    public String getArticleById(@PathVariable Long id, Model model) {
        Article article = articleService.findArticleById(id);
        model.addAttribute("article", article);
        return "articleDetail";
    }

}

它可以工作,但与 @RestController 而不是 @Controller 的代码完全相同 不工作

spring spring-boot spring-mvc
1个回答
0
投票

主要区别以及它不起作用的原因是每个控制器返回的内容。 @RestController 在大多数情况下返回 JSON,而在另一方面 @Controller 返回一个表示视图名称的字符串,该视图名称可以是 HTML、JSP 等。 @Controller:用于定义处理 Web 请求并返回视图名称的控制器。视图名称由视图解析器解析,例如 JSP 页面或 Thymeleaf 模板。在本例中,模型对象用于将数据传递到视图层,视图层通常是 HTML 页面。

@RestController:这是一个结合了@Controller和@ResponseBody的便捷注解。它用于创建 RESTful Web 服务。当您使用@RestController时,Spring会将返回的对象直接转换为JSON或XML响应。这意味着没有发生视图解析,因此模型对象在此上下文中不适用。

© www.soinside.com 2019 - 2024. All rights reserved.