首页 文章

spring @Controller和@RestController注释之间的区别

提问于
浏览
275

spring @Controller@RestController 注释之间的区别 .

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

11 回答

  • 396
    • @Controller 用于将类标记为Spring MVC Controller .

    • @RestController 是一个便利注释,除了添加 @Controller@ResponseBody 注释之外什么也没做(参见:Javadoc

    因此,以下两个控制器定义应该相同

    @Controller
    @ResponseBody
    public class MyController { }
    
    @RestController
    public class MyRestController { }
    
  • 8

    在下面的代码中,我将向您展示 @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 默认激活 . 您无需将其添加到函数签名上方 .

  • 18

    @RestController 带注释的类与 @Controller 相同,但处理器方法的 @ResponseBody 是隐含的 .

  • 12

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

    如果在应用程序中定义任何拦截器,它们将不会应用于注释为 @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 {...
    

    最终不会让拦截器与它相关联 .

  • -2

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

    如果使用@controller,则可以在Spring webMVC中返回一个视图 .

  • 44

    正如您在Spring文档中看到的那样(Spring RestController Documentation)Rest Controller注释与Controller注释相同,但假设默认情况下@ResponseBody处于活动状态,因此所有json都被解析为java对象 .

  • 12

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

  • 2

    @RestController 自Spring 4.0.1开始提供 . These controllers表示此处@RequestMapping方法默认采用@ResponseBody语义 .

    在早期版本中,通过使用以下内容可以实现类似的功能:

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

    • <mvc:annotation-driven/> 可以用作与Jackson或xml一起使用JSON的方法之一 .

    • MyBean可以定义为

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

    • @ResponseBody 被视为MVC中的视图,它被直接调度而不是从Dispatcher Servlet调度,并且相应的转换器以相关格式转换响应,如text / html,application / xml,application / json .

    但是,Restcontroller已经与ResponseBody和相应的转换器耦合 . 其次,这里,由于不是转换响应体,而是自动转换为http响应 .

  • -2
    • @Controller :此注释只是 @Component 的专用版本,它允许基于类路径扫描自动检测控制器类 .

    • @RestController :此注释是 @Controller 的专用版本,它自动添加 @Controller@ResponseBody 注释,因此我们不必将 @ResponseBody 添加到我们的映射方法中 .

  • 4

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

  • 0

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

相关问题