Разница между комментариями spring @Controller и @RestController

Разница между аннотациями spring @Controller и @RestController.

Может ли аннотация @Controller использоваться как для приложений Web MVC, так и для REST?
Если да, то как мы можем дифференцироваться, если это приложение Web MVC или REST.

293
11 авг. '14 в 14:34
источник поделиться
11 ответов
  • @Controller используется для обозначения классов как Spring MVC Controller.
  • @RestController - удобная аннотация, которая делает не что иное, как добавление аннотаций @Controller и @ResponseBody (см. Javadoc)

Итак, следующие два определения контроллера должны делать то же самое

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }
415
11 авг. '14 в 14:41
источник

Связанные вопросы


Похожие вопросы

В приведенном ниже коде я покажу вам разницу между @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 активирован по умолчанию. Вам не нужно добавлять его над сигнатурой функции.

47
22 дек. '15 в 12:54
источник

@RestController аннотированные классы совпадают с @Controller, но подразумеваются @ResponseBody в методах обработчика.

18
11 авг. '14 в 14:41
источник

Если вы используете @RestController вы не сможете вернуть представление (с помощью Viewresolver в Spring/@ResponseBody), и да @ResponseBody в этом случае не требуется.

Если вы используете @Controller вы можете вернуть представление в Spring web MVC.

15
27 июня '17 в 14:54
источник

Собственно, будьте осторожны - они не совсем то же самое.

Если вы определяете какие-либо перехватчики в своем приложении, они не будут применяться к контроллерам, аннотированным как @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 {...

не заканчивается тем, что связанный с ним перехватчик.

12
04 февр. '15 в 7:42
источник

Как вы можете видеть в документации Spring (Spring Документация RestController) Аннотации Rest Controller совпадают с аннотацией Controller, но при условии, что @ResponseBody активен по умолчанию, поэтому все json обрабатываются java-объектами.

8
11 авг. '14 в 14:41
источник

Новая аннотация @RestController в Spring4 +, которая отмечает класс как контроллер, где каждый метод возвращает объект домена вместо представления. Его сокращение для @Controller и @ResponseBody свернуто вместе.

4
18 янв. '17 в 11:59
источник

@RestController был предоставлен с Spring 4.0.1. Эти контроллеры указывают, что здесь методы @RequestMapping предполагают семантику @ResponseBody по умолчанию.

В более ранних версиях аналогичная функциональность могла быть достигнута при использовании ниже:

  • @RequestMapping в сочетании с @ResponseBody как @RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  • <mvc:annotation-driven/> может использоваться как один из способов использования JSON с Jackson или xml.

  • MyBean можно определить как

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

  1. @ResponseBody рассматривается как вид здесь среди MVC и отправляется напрямую, а отправляется из диспетчера Servlet, а соответствующие конвертеры преобразуют ответ в соответствующем формате, например text/html, application/xml, application/json.

Однако, Restcontroller уже связан с ResponseBody и соответствующими преобразователями. Во-вторых, здесь, поскольку вместо преобразования тела ответа он автоматически преобразуется в ответ HTTP.

2
16 июня '17 в 14:21
источник
  • @Controller: эта аннотация является просто специализированной версией @Component и позволяет автоматически определять классы контроллера на основе сканирования пути к классам.
  • @RestController: эта аннотация является специализированной версией @Controller которая @Controller @ResponseBody аннотации @Controller и @ResponseBody поэтому нам не нужно добавлять @ResponseBody в наши методы отображения.
0
23 авг. '18 в 12:48
источник

@RestController представляет собой состав @Controller и @ResponseBody, если мы не используем @ResponseBody в сигнатуре метода, тогда нам нужно использовать @RestController.

-2
28 янв. '15 в 17:12
источник

Вместо использования @Controller и @ResponseBody, @RestController позволяет вам открывать API-интерфейс Rest в Spring 4.0 и выше.

-2
09 марта '17 в 5:44
источник

Посмотрите другие вопросы по меткам или Задайте вопрос