【问题标题】:Difference between spring @Controller and @RestController annotationspring @Controller 和 @RestController 注解的区别
【发布时间】:2014-10-04 05:24:05
【问题描述】:

spring@Controller@RestController注解的区别。

@Controller 注释可以同时用于 Web MVC 和 REST 应用程序吗?
如果是,我们如何区分它是 Web MVC 还是 REST 应用程序。

【问题讨论】:

  • @RestController 它旨在遵循REST architectural designREST API 的主要目的是仅提供要由另一个应用程序处理的数据。因此,如下所述,您只能发送数据不能返回视图。

标签: java spring spring-mvc


【解决方案1】:
  • @Controller 用于将类标记为 Spring MVC Controller。
  • @RestController 是一个方便的注解,它只不过是添加了@Controller@ResponseBody 注解(参见:Javadoc

所以下面两个控制器定义应该做同样的事情

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }

【讨论】:

  • 我认为@RestController 也会自动将响应转换为 JSON/XML。
  • 只是分享一个 Spring 教程的链接,解释不同之处spring.io/guides/gs/rest-service
  • 另外,如果您使用 Thymeleaf 之类的模板引擎,它将无法与 @RestController 一起使用,因为 @ResponseBody 包含在此注释中。
  • @ResponseBody 使返回的对象成为可能在正文中的东西,例如JSON 或 XML (source)
【解决方案2】:

在下面的代码中,我将向您展示其中的区别 @controller之间

@Controller
public class RestClassName{

  @RequestMapping(value={"/uri"})
  @ResponseBody
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

@RestController

@RestController
public class RestClassName{

  @RequestMapping(value={"/uri"})
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

@ResponseBody 默认被激活。您无需将其添加到函数签名上方。

【讨论】:

    【解决方案3】:

    如果您使用@RestController,则无法返回视图(通过在 Spring/springboot 中使用 Viewresolver)并且在这种情况下不需要 @ResponseBody

    如果你使用@Controller,你可以在 Spring web MVC 中返回一个视图。

    【讨论】:

    • 是的,@ResponseBody 可以放在方法上,表示返回类型应该直接写入 HTTP 响应体(而不是放在模型中,或者解释为视图名称)跨度>
    【解决方案4】:

    @RestController 注释类与@Controller 相同,但处理程序方法上的@ResponseBody 是隐含的。

    【讨论】:

    【解决方案5】:

    @RestController@Controller@ResponseBody 的组合。

    不使用@ResponseBody 注释的@Controller 类中的请求流:

    @RestController 返回一个对象作为响应而不是视图。

    【讨论】:

      【解决方案6】:

      实际上,要小心 - 它们并不完全相同。

      如果您在应用程序中定义任何拦截器,它们将不适用于注解为 @RestController 的控制器,但它们确实适用于注解为 @Controller 的控制器。

      即。拦截器的配置:

      @Configuration
      public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
      
      
          @Override
          public void addInterceptors(InterceptorRegistry registry) {
              registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
          }
      
      }
      

      在 Spring 控制器的声明中:

      @Controller
      public class AdminServiceController {...
      

      但是会起作用

      @RestController
      public class AdminServiceController {...
      

      最终不会让拦截器与之关联。

      【讨论】:

      • @RestController 在 Spring 4x 中引入。这个注解也由@Controller 自己注解,所以如果它不像@Controller 那样工作,那么把它报告为一个错误。
      • @bertybro,这不太对。您可以将Interceptor 关联到@RestController
      • 我已经成功地将Interceptor 附加到@RestController
      • 这意味着,上述假设是错误的?所以当然这意味着只协助隐式 @ResponseBody 注释。
      【解决方案7】:

      正如您在 Spring 文档中看到的 (Spring RestController Documentation) Rest Controller 注解与 Controller 注解相同,但假设 @ResponseBody 默认处于活动状态,因此所有 Java 对象都在响应正文中序列化为 JSON 表示.

      【讨论】:

        【解决方案8】:

        @Controller 返回View@RestController 返回ResponseBody

        【讨论】:

        • 你应该解释更多。这是如何回答问题的?
        • @Yunnosch 'view' 是您的前端,如 jsp 或 html。 ResponseBody 可以是xml、json、yaml
        • edit您的回答添加有用的信息。但是我仍然不明白它应该如何回答这个问题。你能用“是的,你可以/不,你不能,因为……”这样的解释吗?
        【解决方案9】:

        Spring4+ 中的新 @RestController 注解,将类标记为控制器,其中每个方法都返回域对象而不是视图。它是 @Controller 和 @ResponseBody 组合在一起的简写。

        【讨论】:

          【解决方案10】:

          @RestController 从 Spring 4.0.1 开始提供。 These controllers 表示这里的@RequestMapping 方法默认采用@ResponseBody 语义。

          在早期版本中,类似的功能可以通过以下方式实现:

          1. @RequestMapping 加上@ResponseBody 就像@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

          2. <mvc:annotation-driven/> 可用作将 JSON 与 Jackson 或 xml 一起使用的一种方式。

          3. MyBean 可以定义为

          @XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }

          1. @ResponseBody 在这里被视为 MVC 中的视图,它是直接调度的,而不是从 Dispatcher Servlet 调度的,各个转换器将响应转换为相关格式,如 text/html、application/xml、application/json。

          但是,Restcontroller 已经与 ResponseBody 和相应的转换器耦合。其次,这里因为不是转换responsebody,而是自动转换为http response。

          【讨论】:

            【解决方案11】:
            • @Controller:这个注解只是@Component 的一个特殊版本,它允许控制器类根据类路径扫描自动检测。
            • @RestController:此注解是@Controller 的特殊版本,它会自动添加@Controller@ResponseBody 注解,因此我们不必在映射方法中添加@ResponseBody

            【讨论】:

              【解决方案12】:

              @Controller 注释表明该类是一个类似于 Web 控制器的“控制器”,而 @RestController 注释表明该类是一个控制器,其中 @RequestMapping 方法默认采用 @ResponseBody 语义,即服务 REST API

              【讨论】:

                【解决方案13】:

                @Controller 用于使用 JSP 的遗留系统。它可以返回视图。 @RestController 表示控制器正在提供 JSON 响应类型的 REST 服务。所以它将@Controller@ResponseBody 注释包装在一起。

                【讨论】:

                  【解决方案14】:

                  @Controller 用于将类标记为 Spring MVC 控制器。
                  @RestController 是一个方便的注解,它只是集成了@Controller@ResponseBody 注解。

                  所以下面的两个控制器定义应该做同样的事情。
                  例如:

                  @Controller
                  @RequestMapping("users")
                  public class HomeController {
                  
                      @GetMapping(produces = "application/json")
                      public @ResponseBody User getAllUsers() {
                          return findAllUsers();
                      }
                  }
                  
                  @RestController
                  @RequestMapping("users")
                  public class HomeController {
                  
                      @GetMapping(produces = "application/json")
                      public Book getAllUsers() {
                          return findAllUsers();
                      }
                  }
                  

                  【讨论】:

                    【解决方案15】:

                    @RestController@Controller@ResponseBody的组合,如果我们在方法签名中没有使用@ResponseBody,那么我们需要使用@Restcontroller

                    【讨论】:

                      【解决方案16】:

                      在 Spring 4.0 及更高版本中,@RestController 让您公开 Rest API,而不是使用 @Controller 和 @ResponseBody。

                      【讨论】:

                      • 你想说我认为@RestController 也会自动将响应转换为JSON/XML。 ?你用了一个抽象的句子而不是解释清楚,我不建议这样做。
                      • 想一想,@Controller 的作用与 hte 生成和使用 MIME 类型 JSON/XML 或其他方式相同...@ResponseBody 告诉 Controller 在不生成视图的情况下表现得像 REST 端点。 RestController 隐含地这样做。
                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-08-27
                      • 2012-05-17
                      • 1970-01-01
                      • 2019-01-08
                      • 2018-04-15
                      • 1970-01-01
                      • 2020-08-25
                      相关资源
                      最近更新 更多