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

Sri*_*nth 326 java spring spring-mvc

弹簧@Controller@RestController注释之间的区别.

可以@Controller注解同时用于Web MVC框架和REST的应用程序?
如果是,我们如何区分它是Web MVC还是REST应用程序.

mic*_*cha 451

  • @Controller 用于将类标记为Spring MVC Controller.
  • @RestController是一个方便的注释,只是添加@Controller@ResponseBody注释(参见:Javadoc)

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

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }
Run Code Online (Sandbox Code Playgroud)

  • 我认为@RestController还会自动将响应转换为JSON/XML. (41认同)
  • 此外,如果您使用像'Thymeleaf`这样的模板引擎,它将无法与`@ RestController`一起使用,因为这个注释中包含了`@ ResponseBody`. (8认同)
  • `@ ResponseBody`使返回的对象成为可能在体内的东西,例如JSON或XML([source](/sf/answers/2005299061/)) (3认同)

BER*_*ine 51

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

@Controller
public class RestClassName{

  @RequestMapping(value={"/uri"})
  @ResponseBody
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}
Run Code Online (Sandbox Code Playgroud)

@RestController

@RestController
public class RestClassName{

  @RequestMapping(value={"/uri"})
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}
Run Code Online (Sandbox Code Playgroud)

@ResponseBody默认情况下启用.您无需将其添加到函数签名之上.


Rav*_*dje 19

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

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


Bar*_*art 18

@RestController带注释的类是相同的,@Controller@ResponseBody暗示了处理程序方法.

  • 优秀文章 https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/ (2认同)

小智 12

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

如果在应用程序中定义任何拦截器,它们将不会应用于注释为的控制器@RestController,但它们可以使用带@Controller注释的控制器.

即.拦截器的配置:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


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

}
Run Code Online (Sandbox Code Playgroud)

并在Spring控制器的声明中:

@Controller
public class AdminServiceController {...
Run Code Online (Sandbox Code Playgroud)

然而,会工作

@RestController
public class AdminServiceController {...
Run Code Online (Sandbox Code Playgroud)

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

  • `@ RestController`是在Spring 4x中引入的.这个注释也由`@Controller`注释,所以如果它不像`@Controller`那样工作,那么就把它报告为bug. (2认同)

小智 9

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


Job*_*ews 9

@RestController是的组合@Controller@ResponseBody

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

在此处输入图片说明

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

在此处输入图片说明


小智 6

@Controller返回View@RestController返回ResponseBody

  • 你应该多解释一下。这是如何回答这个问题的? (4认同)

小智 5

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

\n