it-roy-ru.com

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

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

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

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

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

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }
425
micha

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

48
BERGUIGA Mohamed Amine

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

18
Bart

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

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

16
Ravi Wadje

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

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

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

8
CAAY

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

4
yancy

@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-ответ.

2
hi.nitish
  • @Controller: эта аннотация является просто специализированной версией @Component и позволяет автоматически определять классы контроллера на основе сканирования пути к классам.
  • @RestController: эта аннотация является специализированной версией @Controller, которая автоматически добавляет аннотации @Controller и @ResponseBody, поэтому нам не нужно добавлять @ResponseBody в наши методы отображения.
0
Prashant Goswami