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

357

Разница между весной @Controllerи @RestControllerаннотацией.

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

Srikanth
источник

Ответы:

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, объясняющий разницу spring.io/guides/gs/rest-service
Mina Samy
9
Также, если вы используете шаблонный движок, Thymeleafон не будет работать, @RestControllerиз-за @ResponseBodyчего включен в эту аннотацию.
Sonique
3
@ResponseBodyпревращает возвращаемые объекты во что-то, что может находиться в теле, например, в JSON или XML ( источник )
Martin Thoma
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вы можете вернуть представление в Spring Web 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 {...

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

bertybro
источник
2
@RestControllerбыл представлен весной 4х. Эта аннотация также аннотируется сама собой, @Controllerпоэтому, если она не работает как, @Controllerто сообщите об этом как об ошибке.
Гаагонг
@bertybro, это не совсем верно. Вы можете связать Interceptorс @RestController.
Ravi-A-
Я, безусловно, успешно прикрепил Interceptorк @RestController.
Бен Барден
11

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

CAAY
источник
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, и оно отправляется напрямую, а не отправляется из сервлет-диспетчера, и соответствующие преобразователи преобразуют ответ в связанном формате, таком как text / html, application / xml, application / json.

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

hi.nitish
источник
2

@Controllerвозвращается View. @RestControllerвозвращается ResponseBody.

G.Brown
источник
2
Вы должны объяснить больше. Как это отвечает на вопрос?
Yunnosch
@Yunnosch 'view' - это ваш внешний интерфейс, такой как jsp или html. ResponseBody может быть xml, json, yaml
Дж. Браун
Пожалуйста, отредактируйте свой ответ, чтобы добавить полезную информацию. Однако я до сих пор не понимаю, как это должно ответить на вопрос. Не могли бы вы сформулировать объяснение типа «Да, вы можете / Нет, вы не можете, потому что…»?
Юннош
1

Аннотация @RestController была введена в Spring 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-интерфейсы отдыха в Spring 4.0 и выше.

CoffeeBeanie
источник
Вы хотите сказать, что я думаю, @RestController также автоматически конвертирует ответ в JSON / XML. ? Вы использовали абстрактное предложение вместо того, чтобы объяснить это ясно, я не буду предлагать это.
CinqS
Если подумать, то @Controller делает то же самое, что и hte создает и потребляет MIME-типы JSON / XML или другие ... @ ResponseBody говорит Controller вести себя как конечная точка REST без создания View. RestController неявно делает это.
CoffeeBeanie