Статьи

Разница между @RestController и аннотацией @Controller в Spring MVC и REST

Аннотация @RestController в Spring MVC — это не что иное, как сочетание аннотации @Controller и @ResponseBody . Он был добавлен в Spring 4.0 для упрощения разработки веб-служб RESTful в среде Spring. Если вы знакомы с веб-службами REST, вы знаете, что принципиальное различие между веб-приложением и API-интерфейсом REST заключается в том, что ответ веб-приложения представляет собой общий вид HTML + CSS + JavaScript, тогда как API-интерфейс REST просто возвращает данные в форме JSON или XML. Эта разница также очевидна в аннотации @Controller и @RestController . Задача @Controller — создать карту объекта модели и найти представление, но @RestController просто возвращает объект, и данные объекта напрямую записываются в HTTP-ответ в виде JSON или XML.

Это также можно сделать с помощью традиционного @Controller и использования аннотации @ResponseBody но так как это стандартное поведение веб-сервисов RESTful, Spring представил @RestController который сочетал в себе поведение @Controller и @ResponseBody .

Вкратце, следующие два фрагмента кода в Spring MVC равны:

1
2
3
4
5
@Controller
@ResponseBody
public class MVCController {
   .. your logic
}
1
2
3
4
@RestController
public class RestFulController {
  .... your logic
}

Очевидно, что все хотели бы объявить только одну аннотацию вместо двух. Кроме того, @RestController более очевиден, чем предыдущие два.

Что такое @Controller и @RestController в Spring?

В среде Spring Controller — это класс, который отвечает за подготовку карты модели с данными, отображаемыми представлением, а также за выбор правильного представления. Он также может напрямую записывать в поток ответов с помощью аннотации @ResponseBody и завершать запрос.

Поведение записи непосредственно в поток ответов очень полезно для ответа на вызовы веб-сервисов RESTful, потому что там мы просто возвращаем данные вместо того, чтобы возвращать представление, как объяснялось в моем предыдущем посте о внутренней работе Spring MVC .

Если вы разрабатывали веб-сервисы RESTful до Spring 4, например, в Spring 3 или Spring 3.1, вы были бы знакомы с использованием комбинации @Controller и @ResponseBody для создания ответа RESTful. Ребята из Spring @RestController эту @RestController и создали @RestController .

Теперь вам не нужно использовать аннотацию @Controller и @RestponseBody . Вместо этого вы можете использовать @RestController для обеспечения той же функциональности. Короче говоря, это удобный контроллер, который объединяет в себе поведение @Controler и тела @Response .

Вы также можете присоединиться к REST Eugen Paraschiv с классом Spring Master, если вам больше интересно изучать передовые методы разработки веб-службы RESTFul в Spring.

Разница между @RestController и @Controller в Spring

Теперь, когда вы знакомы с обеими этими аннотациями, самое время проанализировать некоторые фактические различия между @RestController и @Controler . Это очень важная концепция, причем не только с точки зрения интервью, но и с точки зрения сертификации разработчиков Spring Core и Spring Web Application. Если вы готовитесь к весенней сертификации , вы должны быть знакомы с такими тонкими различиями. Кроме того, вы также можете ознакомиться с бесплатными тестами Spring, чтобы получить представление о формате экзамена и уровне вопросов.

В любом случае, давайте вернемся к сути, вот некоторые важные различия между этими двумя аннотациями.

  1. @Controller — это обычная аннотация, которая используется для пометки класса как Spring MVC Controller, тогда как @RestController — это специальный контроллер, используемый в веб-сервисах RESTFul, и эквивалент @Controller + @ResponseBody .
  2. @RestController является относительно новым, добавлен только в Spring 4.0, но @Controller является старой аннотацией, существует с тех пор, как Spring начал поддерживать аннотацию, и официально он был добавлен в версии Spring 2.5.
  3. Аннотация @Controller указывает, что класс является «Контроллером», например, веб-контроллером, в то время @RestController примечание @RestController указывает, что класс является контроллером, где методы @ResponseBody по умолчанию принимают семантику @ResponseBody , то есть обслуживают REST API.
  4. @Controller — это специализация аннотации @RestController а @RestController — это специализация аннотации @Controller . На самом деле это удобный контроллер, аннотированный @Controller и @ResponseBody как показано ниже.
    1
    2
    3
    4
    5
    6
    @Target(value=TYPE)
    @Retention(value=RUNTIME)
    @Documented
    @Controller
    @ResponseBody
    public @interface RestController

    и вот как выглядит объявление @Controller :

    1
    2
    3
    4
    5
    @Target(value=TYPE)
    @Retention(value=RUNTIME)
    @Documented
    @Component
    public @interface Controller
  5. Одно из ключевых отличий между @Controler и @RestCotroller в Spring MVC заключается в том, что если вы пометите класс как @RestController то каждый метод будет записан как объект домена вместо представления. Вы можете увидеть введение Брайана Хассена в Spring MVC 4, чтобы узнать больше об использовании аннотации @RestController в приложении на основе Spring.
  6. Другое ключевое отличие между @RestController и @Controller заключается в том, что вам не нужно использовать @ResponseBody для каждого метода-обработчика, когда вы аннотируете класс с помощью @RestController как показано ниже:

    с @RestControler:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @RestController
    public class Book{
     
    @RequestMapping(value={"/book"})
    public Book getBook(){
    //...
    return book;
    }
    }

    без @RestController:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    @Controller
    public class Book{
     
    @RequestMapping(value={"/book"})
    @ResponseBody
    public Book getBook(){
    //...
    return book;
    }
    }

Вы можете видеть, что если вы используете аннотацию Spring MVC @Controller для создания ответа RESTful, вам нужно аннотировать каждый метод аннотацией @ResponseBody , которая не требуется при использовании @RestController . Это не только делает ваш код более читабельным, но и экономит для вас пару нажатий клавиш.

Вот простой пример HelloWorld с использованием @RestController и @RestController SpringBoot :

Вот и все о разнице между аннотациями @Controller и @RestController в Spring MVC и REST. @RestController — это всего лишь ярлык для совместного использования аннотаций @Controller и @ResponseBody .

Spring специально добавил эту аннотацию в Spring 4, чтобы упростить разработку веб-сервисов RESTful с помощью Spring Framework. Он может напрямую преобразовывать ответ в JSON или XML в зависимости от типа запроса MIME.

Итак, если вы создаете веб-службы RESTful, лучше использовать @RestController чем объединять @Controller с @ResponseBody .

Если вы хотите больше узнать о разработке веб-сервисов RESTful с использованием среды Spring и Spring Security, я предлагаю вам присоединиться к REST Eugen Paraschiv с классом Spring Coaching . У Евгения есть хороший реальный опыт разработки и защиты веб-сервисов RESTful на Java, и этот класс — хорошая возможность извлечь выгоду из его огромного опыта.