Різниця між анотацією spring @Controller та @RestController


356

Різниця між весною @Controllerта @RestControllerанотацією.

Чи можна @Controllerанотацію використовувати як для веб-програм MVC, так і для REST?
Якщо так, то як ми можемо диференціювати, чи це веб-додаток MVC або REST.

Відповіді:


471
  • @Controller використовується для позначення класів як Spring MVC Controller.
  • @RestControllerце примітка про зручність, яка не означає нічого, крім додавання @Controllerта @ResponseBodyприміток (див.: Javadoc )

Отже наступні два визначення контролера повинні робити те саме

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }


48
Я думаю, що @RestController також автоматично перетворює відповідь на JSON / XML.
arnabkaycee

1
Просто поділившись посиланням на весняний підручник з поясненням різниці spring.io/guides/gs/rest-service
Міна Самі

9
Крім того, якщо ви використовуєте движок шаблонів, Thymeleafвін не працюватиме з- @RestControllerза того, @ResponseBodyщо включено до цієї анотації.
Sonique

3
@ResponseBodyробить об’єкти, що повертаються, до чогось, що може бути в тілі, наприклад, JSON або XML ( джерело )
Мартін Тома

59

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


1
Імена класів на Java повинні починатися з великої літери, тобто RestClassName (не restClassName).
Раззл

24

Якщо ви користуєтесь, @RestControllerви не можете повернути представлення даних (за допомогою ViewresolverSpring / Springboot), і так @ResponseBodyу цьому випадку не потрібно.

Якщо ви користуєтесь, @Controllerви можете повернути представлення даних у Весняний веб-MVC.


Так, @ResponseBody може бути застосований до методу і вказує, що тип повернення повинен бути записаний прямо до тіла відповіді HTTP (а не розміщений у Моделі або інтерпретований як ім'я перегляду)
PraveenKumar Lalasangi


14

Власне, будьте обережні - вони не зовсім однакові.

Якщо ви визначите будь-які перехоплювачі у вашій програмі, вони не застосовуватимуться до контролерів, зазначених як @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була представлена ​​навесні 4x. Ця анотація також позначається самим собою, @Controllerякщо вона не працює як @Controllerтоді, повідомте про це як про помилку.
gaoagong

@bertybro, це не зовсім правильно. Ви можете пов’язати Interceptorа @RestController.
Ravi-A-Doer

Я, безумовно, успішно додав додаток Interceptorдо @RestController.
Бен Барден

11

Як ви можете бачити у весняній документації ( Документація Spring RestController ) Анотація решти контролера така ж, як анотація контролера, але припускаючи, що @ResponseBody за замовчуванням активний, тому всі json розбираються на об'єкти Java.


4

Нова анотація @RestController у Spring4 +, яка позначає клас як контролер, де кожен метод повертає доменний об’єкт замість перегляду. Це стенограма для @Controller та @ResponseBody.


3

@RestControllerнадається з весни 4.0.1. Ці контролери вказують, що тут @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 з Джексоном або xml.

  3. MyBean можна визначити як

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

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

Однак Restcontroller вже поєднаний з ResponseBody та відповідними перетворювачами. По-друге, тут, оскільки замість перетворення відповіді, воно автоматично перетворюється на http-відповідь.


2

@Controllerповертає View. @RestControllerповертає ResponseBody.


2
Вам слід пояснити більше. Як це відповідає на питання?
Yunnosch

@Yunnosch 'view' - це ваш передній кінець, як jsp або html. ResponseBody може бути xml, json, yaml
G.Brown

Будь ласка , змініть свій відповідь , щоб додати корисну інформацію. Однак я все ще не розумію, як це має відповісти на питання. Чи можете ви сформулювати пояснення на кшталт "Так, ви можете / Ні, не можете, тому що ...."?
Yunnosch

1

Анотація @RestController була представлена ​​навесні 4.0 для спрощення створення веб-служб RESTful. Анотація про зручність, яка поєднує @Controller і @ResponseBody, - це виключає необхідність коментувати кожен метод обробки запиту класу контролера з анотацією @ResponseBody.


0
  • @Controller: Ця анотація є лише спеціалізованою версією, @Componentі вона дозволяє автоматично виявляти класи контролерів на основі сканування класного шляху.
  • @RestController: Ця анотація є спеціалізованою версією, @Controllerяка додає @Controllerта @ResponseBodyкоментує автоматично, тому нам не доведеться додавати @ResponseBodyдо наших методів відображення.

0

@Controller використовується в застарілих системах, які використовують JSP. він може повертати перегляди. @RestController означає, що контролер надає послуги REST з типом відповіді JSON. тож він поєднує анотації @Controller та @ResponseBody разом.


-3

@RestController- це композиція, @Controllerі @ResponseBodyякщо ми не використовуємо @ResponseBodyпідпис методу, тоді нам потрібно використовувати @Restcontroller.


-3

Замість використання @Controller та @ResponseBody, @RestController давайте викрийте API відпочинку у весному 4.0 та вище.


Ви хочете сказати я думаю, що @RestController також автоматично перетворює відповідь на JSON / XML. ? ви використали абстрактне речення замість того, щоб пояснити його чітко, я цього не пропоную.
cinqS

Подумайте про це, @Controller робить те саме, що hte виробляє і споживає типи mime JSON / XML чи іншим чином ... @ ResponseBody повідомляє Controller поводитися як кінцева точка REST, не створюючи View. RestController неявно це робить.
CoffeeBeanie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.