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

时间:2014-08-11 11:34:10

标签: java spring spring-mvc

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

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

15 个答案:

答案 0 :(得分:420)

  • @Controller用于将类标记为Spring MVC Controller。
  • @RestController是一个便捷注释,除了添加@Controller@ResponseBody注释外,其他功能只有一个(参见:Javadoc

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

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }

答案 1 :(得分:48)

在下面的代码中,我将向您展示其中的差异 在@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。您不需要将其添加到函数签名之上。

答案 2 :(得分:18)

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

答案 3 :(得分:16)

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

如果使用@Controller,则可以在Spring Web MVC中返回视图。

答案 4 :(得分: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 {...

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

答案 5 :(得分:8)

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

答案 6 :(得分:4)

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

答案 7 :(得分:2)

从Spring 4.0.1开始提供了

@RestControllerThese 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可以定义为
  4. @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
    2. 但是,Restcontroller已经与ResponseBody和相应的转换器耦合。其次,在这里,由于不是转换响应体,而是自动转换为http响应。

答案 8 :(得分:0)

  • @Controller:此注释只是@Component的专用版本,它允许根据类路径扫描自动检测控制器类。
  • @RestController:此注释是@Controller的专用版本,它会自动添加@Controller@ResponseBody注释,因此我们不必在我们的目录中添加@ResponseBody映射方法。

答案 9 :(得分:0)

protected function renderHttpException(HttpExceptionInterface $e) { if (app()->environment() !== 'production' && config('app.debug')) { return $this->convertExceptionToResponse($e); } return parent::renderHttpException($e); } 返回@ControllerView返回@RestController

答案 10 :(得分:0)

@Controller在使用JSP的旧系统中使用。它可以返回视图。 @RestController用来标记控制器正在提供JSON响应类型的REST服务。因此它将@Controller和@ResponseBody批注包装在一起。

答案 11 :(得分:0)

@Controller注释指示该类是类似于Web控制器的“控制器”,而@RestController注释指示该类是默认情况下@RequestMapping方法采用@ResponseBody语义(即为REST API服务)的控制器。

答案 12 :(得分:0)

@RestController@Controller@ResponseBody的组合。

@Controller类中的请求流,而不使用@ResponseBody批注:

enter image description here

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

enter image description here

答案 13 :(得分:-2)

@RestController@Controller@ResponseBody组成,如果我们未在Method签名中使用@ResponseBody,则我们需要使用@Restcontroller。< / p>

答案 14 :(得分:-2)

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